[프로그래머스/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. 참가자 명단에서 이름 빈도수를 센 뒤
  2. 완주자 명단을 보며 하나씩 차감
  3. 마지막에 값이 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"
반응형