본문 바로가기

프로그래밍 언어/Python3

[프로그래머스 코딩테스트 연습] 해시 1. 완주하지 못한 선수

해시 

1. 완주하지 못한 선수


문제 설명

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

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

제한사항

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

테스트 케이스 

# test case 1
participant = 	["leo", "kiki", "eden"]
completion = ["eden", "kiki"]
print(solution(participant, completion))

# test case 2
participant = ["marina", "josipa", "nikola", "vinko", "filipa"]
completion = ["josipa", "filipa", "marina", "nikola"]
print(solution(participant, completion))

# test case 3
participant = ["mislav", "stanko", "mislav", "ana"]
completion = ["stanko", "ana", "mislav"]
print(solution(participant, completion))

솔루션 소스코드 

def solution(participant, completion):
    answer = ''
    hash = {}
    for p in participant:
        if p in hash:
            hash[p] += 1
        else:
            hash[p] = 0

    for c in completion:
        if hash[c] == 0:
            del(hash[c])
        else:
            hash[c] -= 1

    answer = list(hash.keys())[0]

    return answer
  • 해시를 활용하는 문제였기 때문에 파이썬에서 제공하는 딕셔너리 자료 구조를 활용했습니다.
  • participant 리스트에 있는 선수 이름을 키로 정의하고 hash라는 이름의 딕셔너리를 만들었습니다.
  • 그러나 파이썬 딕셔너리에서는 중복 키가 허용되지 않아 동명이인의 경우 가장 뒤에 저장된 값으로 갱신되어 하나만 저장되는 문제가 있었습니다.
  • 이를 해결하기 위해 딕셔너리에 저장되는 키가 중복이 없는 경우에는 데이터를 만들고 밸류를 0 으로 지정했습니다. 그리고 기존에 동명이인이 존재해 키가 중복되는 경우에는 밸류에 1을 더해주었습니다. 예를 들어 위 테스트 케이스 3번의 경우 다음과 같이 딕셔너리에 저장됩니다. 
{'mislav': 1, 'stanko': 0, 'ana': 0}
  • 예시의 경우 participant 리스트에 mislav라는 사람이 한명 더, 즉 2명 존재하고, 나머지는 한명씩만 존재한다는 것을 의미합니다. 
  • 그리고 completion 리스트에 있는 값들을 하나씩 hash 딕셔너리에 있는지 확인하면서 존재하면 리스트에 삭제를 하여 완주하지 못한 선수를 남겨주는 방식으로 답을 구했습니다.
  • 이때 밸류가 0인 키는 한명만 존재하는 것이므로 리스트에서 바로 제거하고, 1 이상인 경우에는 동명이인이 존재한다는 의미이므로 값 자체를 제거하지 않고 밸류를 1 감소시킵니다.