코딩테스트/프로그래머스

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

블랙곰 2022. 2. 6. 22:11

2022 KAKAO BLIND RECRUITMENT

 

Lv1. 해시 유형

 

문제설명

 

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
  • k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
    • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
  • return 하는 배열은 id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.

 

문제풀이

from collections import OrderedDict
import copy

def solution(id_list, report, k):
    reported_ids = OrderedDict((x, []) for x in id_list)
    mail_ids = copy.deepcopy(reported_ids)
    
    for x in report:
        x_sep = x.split(' ')
        user_id = x_sep[0]
        reported_id = x_sep[1]
        
        if not user_id in reported_ids[reported_id]:
            reported_ids[reported_id].append(user_id)
            if len(reported_ids[reported_id]) == k:
                for y in reported_ids[reported_id]:
                    mail_ids[y].append(reported_id)
            elif len(reported_ids[reported_id]) > k:
                mail_ids[user_id].append(reported_id)
    
    return [len(x) for x in mail_ids.values()]

 

아래의 변수를 두고 문제를 풀이하면 된다.

 

reported_ids: 신고당한 아이디와 신고한 아이디 리스트 딕셔너리
mail_ids: 신고한 아이디와 정지된 아이디 리스트 딕셔너리

 

최적화 포인트

 

동일한 유저에 대한 신고 처리는 1회로 처리하고,

k번째 신고 당했을때와 그 이후 처리 방법을 조건문으로 풀이하면 된다.