[프로그래머스(Lv 1)/파이썬] 신고 결과 받기

jwKim·2023년 11월 1일
0

💻코테코테

목록 보기
38/42

📌 문제

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

📌 풀이

코드

def solution(id_list, report, k):
    answer = []
    
    id_dict = {i : set([]) for i in id_list} # id당 신고한 사람을 딕셔너리로 관리 / { 이름 : {} } -> 중복을 제거해야하므로 set으로 설정
    num_dict = {i : 0 for i in id_list} # id당 신고 당한 횟수
    
    for r in report :
        p = r.split()
        temp = id_dict[p[0]] # 추가하기 이전 set
        id_dict[p[0]] = id_dict[p[0]].union({p[1]}) # 신고한 사람 추가
        if len(temp) != len(id_dict[p[0]]): # 이미 한 번 신고한 이력이 있으면 pass
            num_dict[p[1]] += 1 # 신고 당한 횟수 더하기
    
    # 신고 당한 횟수가 k번 이상인 사람
    p_list = [name for name, count in num_dict.items() if count >= k] 
    
    # 개별 직원마다 반복
    for id in id_list :
        count = 0 # 안내 횟수 초기화
        for i in range(len(id_dict[id])) : # 이 사람이 신고한 사람 수만큼 반복
            if list(id_dict[id])[i] in p_list :
                count += 1
        answer.append(count)    
    
    return answer

설명

이번 문제는 딕셔너리 두 개를 가지고 풀었다. 각 딕셔너리는 아래와 같다.

  • id_dict : 어떤 사람이 신고한 사람들을 담아놓음
    • key : 사람, value = set([])
    • 여러번 신고해도 리스트업은 한 번만 되어야 하므로 리스트가 아니라 set으로 선언
    • set은 원소를 직접 추가할 수가 없고 대신 set과 set을 합치는 방법을 써야함 그래서 set.union()을 사용
    • 예 : { "muzi" : ["frodo", "neo"] }
  • num_dict : 신고 당한 횟수를 담아놓음
    • 중복으로 신고한 경우 1회로 치기 때문에 이를 판단하기 위해 set의 길이를 기준으로 판단함
    • 신고 대상자를 넣기 전 길이와 넣은 후 길이가 같다는 것은 중복 신고 했다는 것이므로 카운팅 하면 안 됨
    • 예 : { "muzi" : 2 }

이렇게 두 개의 딕셔너리를 세팅했다면, 신고 당한 횟수가 k 이상인 직원을 찾아 p_list에 넣는다.

이제 id_dict에서 신고한 사람이 k 이상인지 여부를 판단하는데, 반복마다 k회 이상인 사람의 수를 셀 count를 초기화 해 넣어준다.

0개의 댓글