티스토리 뷰

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1. 접근 방식

  • 누가 누구를 신고했고, 누가 얼만큼 신고당했는지를 딕셔너리로 확인하자.

누가 누구를 신고했는지 나타내는 딕셔너리 reports는 key가 신고한 유저의 이름이고, value는 key한테 신고 당한 유저들의 집합이다. 누가 얼만큼 신고당했는지 나타내는 딕셔너리 warnings는 key는 유저 이름, value는 누적 신고 수이다.

report의 각 원소에서 왼쪽에는 신고한 사람(key), 오른쪽은 신고 당한 사람(value)의 이름이 나온다. 따라서 report를 순회하면서 reports[key]의 집합에 value를 add한다.

이때 key라는 유저가 value 유저를 여러 번 신고하더라도, 1회 신고한 것으로 처리된다. 따라서 value라는 유저가 key가 신고한 유저 집합에 존재하지 않을 때만 warnings[value]의 누적 신고 수를 +1 해야 한다.

 

테스트 값

즉, 위와 같은 테스트 값이 있을 때 reports와 warnings 딕셔너리 내부 값이 이렇게 변화한다.

 

 

2. 정답 코드

  • OrderedDict: 순서를 기억하는 딕셔너리
    • id_list에 입력된 유저 순서대로 몇 개의 메일을 보내야 하는지 results 리스트에 담아야 하기 때문에 OrderedDict을 사용한다.
from collections import OrderedDict

def find_blcoked(data, k):
    return [name for name, value in data.items() if value >= k]
    
def count_mails(data, blocked):
    results = [0] * len(data)
    
    if not blocked:
        return results
    
    for index, users in enumerate(data.values()):
        cnt = 0
        for user in users:
            if user in blocked:
                cnt += 1
        results[index] = cnt
    
    return results

def solution(id_list, report, k):
    warnings = {key: 0 for key in id_list}
    reports = OrderedDict({key: set() for key in id_list})
    
    for info in report:
        key, value = info.split()
        
        if value not in reports[key]:
            reports[key].add(value)
            warnings[value] += 1
    
    blocked = find_blcoked(warnings, k)
    ans = count_mails(reports, blocked)

    return ans
728x90