CS/알고리즘

카카오 2022 코딩테스트 '신고결과받기' 파이썬 풀이

happy_life 2022. 3. 10. 09:10

https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 


내 풀이

from collections import defaultdict


def solution(id_list, report, k):
    answer = [0] *len(id_list)

    report = set(report)

    user_list_i_reported = defaultdict(set)
    num_of_reported = defaultdict(int)
    suspended = []

    for r in report:
        report,be_reported = r.split()
        num_of_reported[be_reported] +=  1
        user_list_i_reported[report].add(be_reported)

        if(num_of_reported[be_reported] == k):
            suspended.append(be_reported)


    print(suspended)




    print(user_list_i_reported)
    return answer

idea

  1.  '한 유저를 여러번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리된다' 는 문제의 조건에서 중복을 허용하지 않는 '집합'을 사용해야겠다는 생각을 하였습니다.
  2. 아래 문제의 표를 보고 딕셔너리를 사용해야겠다는 생각을 하였습니다.

3.defaultdict(set) 를 사용하여 누가 누구를 신고했는지를 정리하고 defaultdict(int)를 사용하여 누가 몇번 신고당했는지의 횟수를 저장하였습니다.

 


다른 사람 풀이 리뷰

def solution(id_list, report, k):
    answer =[0]*len(id_list)
    
    reported_list = defaultdict(int)
    ##중복제거
    report = set(report)
    
    for i in report:
        reported_list[i.split()[1]] += 1
    
    print("reported_lst: "+ str(reported_list))
    print(reported_list['neo'])
    print("report: "+ str(report))
    for i in report:    
        if(reported_list[i.split()[1]] >= k):
            answer[id_list.index(i.split()[0])] += 1
    
    

    return answer

따로 누가 누구를 신고했는지를 저장하지 않고 

index를 활용하여 직접 answer에 값을 넣어주었습니다. for 문을 한번 덜 쓸수 있다는 점에서 굉장히 매력적이었으나, 실전에서 바로 떠올리긴 어려웠을듯합니다.

 

 

 

배운점 &&  공부방향 설정

 

Problem1) 문제를 해석하는 데에 시간이 오래걸렸다.

 -> 많은 문제를 접하면서 문제가 어떤 것을 요구하는지 빨리 이해하는 연습을 하는 방향으로 공부하자.

 

Problem2) defaultdict() 등 자료형에 대한 이해가 부족하여 구현하는데 시간이 오래걸렸다.

 ->자료형 관련 구현에 어려움을 느낄 때마다 그 자료형에 관해 추가적인 공부를 하는 방향으로 나아가자.

 

Problem3) 중간에 꼬이니까 시간이 많이 소요되었다.

 -> 코드의 마지막까지 설계한 후 코딩하는 방향으로 문제를 풀자.