[프로그래머스/python]완주하지 못한 선수
2025. 8. 26. 21:27ㆍ개발/코딩테스트
반응형
📌 문제 맥락
이 코드는 흔히 프로그래머스에서 나오는 “완주하지 못한 선수” 문제 풀이 방식이에요.
- participant: 참가자 명단 (리스트)
- completion: 완주자 명단 (리스트)
- 목표: 참가자 중 완주하지 못한 사람의 이름을 찾아 반환
📖 코드 해석
def solution(participant, completion): result = {}
- result라는 딕셔너리 생성 → 참가자 이름을 key, 그 이름의 등장 횟수를 value로 저장하려고 함.
for i in participant:
if not i in result:
result[i] = 1 else: result[i] += 1
- 참가자 명단을 하나씩 보면서
- result 딕셔너리에 없으면 새로 넣고 값 = 1
- 이미 있으면 값 +1 (동명이인 대비)
- 즉, 참가자 명단의 빈도수를 세는 과정
예시: participant = ["leo", "kiki", "eden", "kiki"] result = {"leo":1, "kiki":2, "eden":1}
for i in completion:
if i in result.keys():
result[i] -= 1
- 완주한 사람들을 하나씩 확인하면서 result에서 값 -1 처리
- 즉, 완주자들을 참가자 명단에서 차감하는 것
예시: completion = ["eden", "kiki", "leo"] 처리 후 result = {"leo":0, "kiki":1, "eden":0}
for p, n in result.items():
if n == 1:
return p
- result에서 값이 1인 key(이름)를 찾아 반환
- 왜냐하면 값이 1이라는 건 참가자 명단에 있었지만 완주자 명단에서 차감되지 않은 사람 → 즉, 완주 못한 사람.
위 예시에서는 {"leo":0, "kiki":1, "eden":0} → kiki가 반환됨.
✅ 요약
이 코드는
- 참가자 명단에서 이름 빈도수를 센 뒤
- 완주자 명단을 보며 하나씩 차감
- 마지막에 값이 1로 남아 있는 사람을 찾아 반환
👉 결과적으로 완주하지 못한 선수의 이름을 찾아내는 함수입니다.
collections.Counter을 이용하여 풀기
- 리스트나 문자열처럼 반복 가능한(iterable) 객체의 원소 개수를 자동으로 세어주는 클래스.
- 결과는 dict와 비슷한 자료구조(Counter 객체)로, 각 원소를 key, 빈도수를 value로 저장합니다.
from collections import Counter
arr = ["a", "b", "a", "c", "b", "a"]
print(Counter(arr)) # 출력: Counter({'a': 3, 'b': 2, 'c': 1})
📖 문제 풀이 (완주하지 못한 선수)
Counter를 활용하면 참가자 명단에서 완주자 명단을 빼는 것만으로도 바로 결과가 나옵니다.
from collections import Counter
def solution(participant, completion): # 참가자 빈도수 - 완주자 빈도수
result = Counter(participant) - Counter(completion) # 남아있는 key가 완주하지 못한 선수
return list(result.keys())[0] # dict_keys(['kiki'])=> 이터러블 객체이므로 list() 변환을 해주어야 한다.
✅ 동작 예시
participant = ["leo", "kiki", "eden", "kiki"]
completion = ["eden", "kiki", "leo"]
print(solution(participant, completion))
# 출력: kiki
- Counter(participant) → {'leo':1, 'kiki':2, 'eden':1}
- Counter(completion) → {'leo':1, 'kiki':1, 'eden':1}
- 두 Counter의 차 → {'kiki':1}
- 따라서 정답은 "kiki"
반응형