
난이도 : level 1
유형 : 해시-키
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/42576
participant과 comepetition 이라는 문자열 배열을 입력 받는다.
두 배열을 비교하여 participant 배열에서 빠진 문자열 하나를 return하는 문제이다.
간단해보이지만 어떻게 비교하여 빠진 문자열을 return할까?
단순히 정렬 후 비교하거나, 해시를 사용하여 횟수를 세는 방식으로 풀 수 있다.
두 배열을 각각 정렬한 뒤 인덱스별로 비교한다.
처음으로 값이 다른 지점의 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()으로 묶어
각 인덱스를 동시에 비교하는 데 사용했다.
각 이름이 나온 횟수를 세어 차감하는 방식이다.
동명이인이 있을 수 있기 때문에 카운트 기반 접근이 안전하다.
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에는 없던 문자열을 의미, ->반환