프로그래머스 - 완주하지 못한 선수 [python]

kimminjunnn·2025년 8월 28일

알고리즘

목록 보기
163/311

난이도 : level 1
유형 : 해시-키
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/42576


문제 파악

participant과 comepetition 이라는 문자열 배열을 입력 받는다.
두 배열을 비교하여 participant 배열에서 빠진 문자열 하나를 return하는 문제이다.

간단해보이지만 어떻게 비교하여 빠진 문자열을 return할까?

단순히 정렬 후 비교하거나, 해시를 사용하여 횟수를 세는 방식으로 풀 수 있다.

1. 정렬 방식

두 배열을 각각 정렬한 뒤 인덱스별로 비교한다.
처음으로 값이 다른 지점의 participant 원소가 완주하지 못한 선수다.
마지막까지 다 같으면 participant의 마지막 원소가 답이 된다.

def solution(participant, completion):
    participant.sort()
    completion.sort()
    
    for p, c in zip(participant, completion):
        if p != c:
            return p # 처음으로 다른부분이 생기면 그 문자열이 답
    return participant[-1] # 마지막까지 같으면 마지막 문자열이 답

💡 zip() 이란?

zip() 함수는 여러 개의 iterable(리스트, 튜플 등)을 묶어주는 파이썬 내장 함수다.
동일한 인덱스끼리 하나의 튜플로 묶어주기 때문에, 두 리스트를 동시에 순회할 때 자주 사용한다.

a = [1, 2, 3]
b = ['a', 'b', 'c']

for x, y in zip(a, b):
    print(x, y)

# 출력
# 1 a
# 2 b
# 3c

👉 이 문제에서는 정렬된 participant와 completion을 zip()으로 묶어
각 인덱스를 동시에 비교하는 데 사용했다.

2. 해시(딕셔너리) 방식

각 이름이 나온 횟수를 세어 차감하는 방식이다.
동명이인이 있을 수 있기 때문에 카운트 기반 접근이 안전하다.

def solution(participant, completion):
    dic = {}
    for p in participant:
        dic[p] = dic.get(p, 0) + 1
        
        # dic.get(p, 0)은 key=p가 없으면 0을 반환한다.
        # 즉, 처음 등장하면 0+1 = 1, 두 번째 등장하면 1+1 = 2가 된다.
    for c in completion:
        dic[c] -= 1
        # c의 이름을 가진 dic 요소들 -1 처리
        
    
    for k, v in dic.items():
        if v > 0:
            return k
            
         # dic의 값 1을 가지면? 걔가 participant에는 있지만 completion에는 없던 문자열을 의미, ->반환   
profile
Frontend Engineers

0개의 댓글