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

jun17114·2020년 12월 9일
0

[프로그래머스]

목록 보기
6/8
post-thumbnail

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예

| participant | completion | return |
|:---:|:---:|:---:|
| ["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
| ["marina", "josipa", "nikola", "vinko", "filipa"] | ["josipa", "filipa", marina, "nikola"] | "vinko" |
| ["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |

예제 #1
leo는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2
vinko는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3
mislav는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.


나의 풀이

def solution(participant, completion):
    answer = ''
    hashTable = {}
    
    for i in range(len(completion)):
        if hash(completion[i]) in hashTable.keys() :
            hashTable[hash(completion[i])] += 1
        else:
            hashTable[hash(completion[i])] = 1

    for j in range(len(participant)):
        if hash(participant[j]) in hashTable.keys() and hashTable[hash(participant[j])] != 0:
            hashTable[hash(participant[j])] -= 1
        else:
            answer = participant[j]
            break
            
    return answer

이번 문제는 Hash를 주제로 한 문제입니다. 하지만 Hash에 대해서 잘 몰라서 찾아보았더니이 문제를 sort로 푼 분들이 많았습니다. 저는 Hash로는 어떻게 푸는지 궁금해서 다양한 접근을 해보았는데 위의 코드로 모든 테스트를 통과하는데 성공했습니다.

먼저 hashTable이라는 Dictionary를 정의해주었습니다. 이곳에 hash()함수를 통해 변환된 값을 Key로 입력할 것입니다.

코드에 크게 2개의 반복문이 있는데 위의 반복문은 completion의 요소들을 hashTable에 입력하는 과정, 아래의 반복문은 participant의 요소 중에 완주하지 못한 선수가 누군지 찾는 과정입니다.

위의 반복문은 completion의 길이만큼 반복되며 hash(completion[i])라는 keyhashTable에 있는지 확인합니다. 만약 없다면 keyhash(completion[i]), value1로 추가해줍니다. 반대로 존재한다면 해당 쌍의 value를 1 더해줍니다.

아래의 반복문은 participant의 길이만큼 반복되며 hash(participant[i])hashTable에 존재하는지 그리고 해당 쌍의 value0이 아닌지 확인합니다. 만약 존재하지만 0이 아니라면 -1을 해줍니다. 이 과정이 있는 이유는 만약 completion에 동명이인이 존재할때 value가 2일테니 -1을 해도 아직 1이 남아있습니다.

만약 두 조건을 충족하지 못하면 완주하지 못한 선수이니 participant[j]를 answer로 정의하여 반환해줍니다.


0개의 댓글