🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42576
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
▶ 마라톤에 참여한 선수들 중 완주하지 못한 선수의 이름을 반환하도록 solution 함수를 작성해라.
제한 조건
· 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
· completion의 길이는 participant의 길이보다 1 작습니다.
· 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
· 참가자 중에는 동명이인이 있을 수 있습니다.
✨ 풀이 과정
💡처음 생각해냈던 풀이 방법
1. participant 배열과 completion 배열을 선언한다.
2. 각각의 배열을 정렬한다.
3. 반복문을 이용하여 participant[i] != completion[i]인 경우 → 여러 명의 동명이인이 있는 경우에 동명이인들 중 한 명이 다 완주하지 못했을 경우에 해당되므로 동명이인을 반환해준다.
4. participant[i] = completion[i] 인 경우 → 동명이인이 없는 경우 제일 마지막에 있는 참가자가 완주하지 못한 참가자가 되는 경우에 해당되므로 제일 마지막에 있는 참가자를 반환해준다.
⬇️1차 시도 전체 코드
participant = ["kiki", "kiki", "eden"]
completion = ["eden", "kiki"]
def solution(participant, completion):
participant.sort()
completion.sort()
for part in range(len(completion)):
# 여러 명의 동명이인이 있는 경우에 동명이인이 다 완주하지 못했을 경우에 해당된다.
if participant[part] != completion[part]:
return participant[part]
# 동명이인이 없는 경우 제일 마지막에 있는 참가자가 완주하지 못한 참가자가 된다.
return participant[-1]
print(solution(participant, completion))
→ 하지만 이 풀이는 해쉬를 이용하는 방법이 아닌 정렬을 이용하는 방법이므로 해쉬를 이용해서 풀어보기로 하였다.
💡해시를 이용한 풀이 방법
1. Hash Map을 만든다.
· Hash Map: Key-Value 의 쌍을 관리하는 클래스이다.
· 여기서 Key는 hash한 값이고, Value 는 각 선수의 이름으로 설정한다.
2. Hash Map에 Participant를 추가한다.
· ‘Hashing한다’ 라고도 표현한다.
· 각 이름의 Hash값(Key)을 구하고 이 값들의 합을 구한다. → sumHash로 정의한다.
3. sumHash에서 완주한 선수의 Hash값을 뺀다.
· sumHash에서 완주자들의 Hash값을 빼면 완주하지 못한 사람의 Hash값만 남는다.
4. 남은 Hash값을 이용해서 Value를 찾으면 완주하지 못한 선수가 나오게 된다.
👩💻 최종 코드
def solution(participant, completion):
#파이썬에서 dict 자료형이 해쉬 맵 역할을 수행하므로 별도의 라이브러리를 임포트하지 않아도 됌.
#hashDict와 sumHash를 초기화한다.
hashDict = {}
sumHash = 0
for part in participant:
# 1. Participant의 dictionary를 만든다.
hashDict[hash(part)] = part
# 2. Participant의 sum(hash)를 구한다.
sumHash += hash(part)
# 3. completion의 sum(hash)를 뺀다.
for comp in completion:
sumHash -= hash(comp)
# 4. 남은 값이 완주하지 못한 선수의 hash 값이 된다.
return hashDict[sumHash]