완주하지 못한 선수 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""완주하지 못한 선수 (프로그래머스 42576) 풀이와 검증."""
import random
from collections import Counter
def solution(participant, completion):
count = {}
for name in participant:
count[name] = count.get(name, 0) + 1
for name in completion:
count[name] -= 1
for name, c in count.items():
if c > 0:
return name
def solution_counter(participant, completion):
left = Counter(participant) - Counter(completion)
return list(left)[0]
def solution_sort(participant, completion):
p, c = sorted(participant), sorted(completion)
for a, b in zip(p, c):
if a != b:
return a
return p[-1]
if __name__ == "__main__":
ex = [
(["leo", "kiki", "eden"], ["eden", "kiki"], "leo"),
(["marina", "josipa", "nikola", "vinko", "filipa"], ["josipa", "filipa", "marina", "nikola"], "vinko"),
(["mislav", "stanko", "mislav", "ana"], ["stanko", "ana", "mislav"], "mislav"),
(["kim", "lee", "kim"], ["lee", "kim"], "kim"),
]
for p, c, want in ex:
for f in (solution, solution_counter, solution_sort):
assert f(p, c) == want, (f.__name__, p, c)
# 집합의 차는 동명이인에서 틀린다
assert set(["kim", "lee", "kim"]) - set(["lee", "kim"]) == set()
rng = random.Random(42576)
for _ in range(2000):
pool = [f"n{i}" for i in range(rng.randint(1, 6))]
participant = [rng.choice(pool) for _ in range(rng.randint(1, 30))]
missing = rng.randrange(len(participant))
completion = participant[:missing] + participant[missing + 1:]
rng.shuffle(completion)
want = participant[missing]
for f in (solution, solution_counter, solution_sort):
assert f(participant, completion) == want
print("ALL CHECKS PASSED")