신고 결과 받기 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""신고 결과 받기 (프로그래머스 92334) 풀이와 검증."""
import random


def solution(id_list, report, k):
    reporters = {name: set() for name in id_list}
    for r in set(report):
        a, b = r.split()
        reporters[b].add(a)
    mail = {name: 0 for name in id_list}
    for b, who in reporters.items():
        if len(who) >= k:
            for a in who:
                mail[a] += 1
    return [mail[name] for name in id_list]


def brute(id_list, report, k):
    pairs = []
    for r in report:
        p = tuple(r.split())
        if p not in pairs:
            pairs.append(p)
    banned = [b for b in id_list if sum(1 for x, y in pairs if y == b) >= k]
    return [sum(1 for x, y in pairs if x == a and y in banned) for a in id_list]


if __name__ == "__main__":
    assert solution(["muzi", "frodo", "apeach", "neo"],
                    ["muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"], 2) == [2, 1, 1, 0]
    assert solution(["con", "ryan"], ["ryan con", "ryan con", "ryan con", "ryan con"], 3) == [0, 0]
    assert solution(["a", "b", "c"], ["a b", "a b", "c b", "b a"], 2) == [1, 0, 1]
    # dict.fromkeys(..., set())는 같은 집합을 나눠 쓴다
    shared = dict.fromkeys(["x", "y"], set())
    shared["x"].add(1)
    assert shared["y"] == {1}
    rng = random.Random(92334)
    for _ in range(1000):
        ids = [f"u{i}" for i in range(rng.randint(2, 8))]
        report = []
        for _ in range(rng.randint(1, 25)):
            a, b = rng.sample(ids, 2)
            report.append(f"{a} {b}")
        k = rng.randint(1, 4)
        assert solution(ids, report, k) == brute(ids, report, k)
    print("ALL CHECKS PASSED")