개발

[프로그래머스]신고 결과 받기 - Python

Hugh Q Lee 2022. 4. 29. 22:18

문제 (2022 카카오 블라인드 채용)

  • 게시판 이용자는 타 이용자를 신고한다.
  • 동일 신고건은 1건으로 처리한다.
  • k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 유저들은 신고 결과를 받는다.
  • 모든 신고 내용을 취합하여 마지막에 한꺼번에 결과를 전송한다.
# Example
id_list = ['muzi', 'frodo', 'apeach', 'neo']
report = ['muzi frodo', 'apeach frodo', 'frodo neo', 'muzi neo', 'apeach muzi']
k = 2

# frodo 2회 신고 당함 -> k 이상이므로 frodo 신고자에게 결과 발송
# neo 2회 신고 당함 -> 신고자에게 결과 발송
# muzi 1회 신고 당함 -> k 미만이므로 결과 발송 안함.
result = [2,1,1,0]

풀이

def solution(id_list, report, k):
    d = {} # 피신고자 : {신고자 집합}
    score = {} # 유저 : 결과 메일 갯수
    for user in id_list:
        d[user] = set()
        score[user] = 0
    
    for r in report:
        reporter, reported = r.split(' ')
        d[reported].add(reporter)

    for v in d.values():
        if len(v) >= k:
            for user in v:
                score[user] += 1
                
    return [v for v in score.values()]

해설

동일 신고건은 1회로 처리해야하므로 set()을 사용한다.

split() 함수로 신고자와 피신고자를 얻은 다음 피신고자(reported)를 dict()의 key로, 신고자 집합({reporter1, reporter2, ...})를 value로 한다.

value인 set()의 length가 k 이상이면 신고자의 수취 메일 갯수를 +1 한다.

이 수취 메일 갯수 dict()를 순서대로 list()로 만들어 return한다.

dict()와 set()에 대한 이해가 필요한 비교적 쉬운 문제였습니다.