🔗 1. 문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/42576
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📝 2. 문제 요구사항 정리
마라톤에 참여한 선수들의 이름이 담긴 participant와 완주한 선수들의 이름이 담긴 completion이 주어졌을 때, 완주하지 못한 선수 한 명의 이름을 찾아 반환하는 문제입니다.
- 입력: participant에는 전체 참가자 이름이, completion에는 완주한 선수 이름이 담겨 있습니다.
- 조건: completion의 길이는 participant보다 1 작고, 참가자 중에는 동명이인이 있을 수 있습니다.
- 반환값: 완주하지 못한 선수의 이름을 반환합니다.
💡 3. 핵심 개념
✔ 1) 이름별 등장 횟수 세기
이 문제에서는 같은 이름을 가진 참가자가 있을 수 있기 때문에 단순히 이름이 존재하는지만 확인하면 안 됩니다. 각 이름이 participant에 몇 번 등장했는지를 딕셔너리에 저장해야 합니다.
✔ 2) 완주자 명단을 기준으로 카운트 줄이기
participant를 순회하며 이름별 인원 수를 세어 둔 뒤, completion을 순회하면서 완주한 선수의 카운트를 하나씩 줄입니다. 이렇게 하면 완주한 사람은 0이 되고, 완주하지 못한 사람만 양수로 남게 됩니다.
✔ 3) 남은 값이 있는 이름 반환하기
마지막으로 딕셔너리를 순회하면서 값이 0보다 큰 이름을 찾으면 됩니다. 문제에서 완주하지 못한 선수는 정확히 한 명이라고 했으므로, 해당 이름을 발견하는 즉시 반환할 수 있습니다.
✅ 4. 정답 Python 코드
def solution(participant, completion):
person = {}
for name in participant:
person[name] = person.get(name, 0) + 1
for name in completion:
person[name] -= 1
for name in person:
if person[name] > 0:
return name
💬 5. 풀이하면서 느낀 점
처음에는 참가자 명단과 완주자 명단의 차이를 단순히 비교하면 된다고 생각할 수 있는데, 풀이를 정리하다 보니 같은 이름이 여러 번 등장할 수 있다는 조건이 핵심이라는 점을 떠올릴 수 있었습니다.
그래서 participant를 먼저 순회하며 이름별 인원 수를 딕셔너리에 저장하고, completion을 순회하면서 완주한 사람 수를 하나씩 줄이는 방식으로 풀었습니다. 마지막에 값이 0보다 큰 이름이 완주하지 못한 선수이므로 바로 반환할 수 있었습니다.
또한, collections.Counter를 사용하면 같은 아이디어를 더 짧게 표현할 수도 있다는 점을 이후에 생각해볼 수 있었습니다.
궁금하신 점이나 포스팅에 대한 피드백이 있다면 댓글로 편하게 남겨주세요.
도움이 되셨다면 공감이나 댓글 한 줄 남겨주시면 포스팅을 이어가는 데 큰 힘이 됩니다. 😊
'코딩테스트 > 알고리즘' 카테고리의 다른 글
| [프로그래머스 LV.0] 등수 매기기 — Python 정답 & 해설 (0) | 2026.06.22 |
|---|---|
| [프로그래머스 LV.0] 문자열 밀기 — Python 정답 & 해설 (0) | 2026.06.19 |
| [프로그래머스 LV.2] 괄호 회전하기 — Python 정답 & 해설 (0) | 2026.06.16 |
| [프로그래머스 LV.0] 유한소수 판별하기 — Python 정답 & 해설 (1) | 2026.06.13 |
| [프로그래머스 LV.0] 배열 만들기 2 — Python 정답 & 해설 (0) | 2026.06.11 |