[해시] 완주하지 못한 선수 (프로그래머스, Level 1)

Soorim Yoon·2022년 9월 12일
0

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42576

  • participant 배열과 completion 배열이 주어진다.
  • participant 배열은 마라톤 참가자, completion 배열은 완주한 선수 이름 배열이다.

두 배열이 주어질 때, 완주하지 못한 선수의 이름을 return 해라.
단, 동명이인이 존재할 수 있다.
ex) 두 명이 같은 이름인데, 완주자 명단에 한 명만 있으면 한 명은 완주를 하지 못한 것이다.
cf) completion 배열의 길이는 participant 보다 1 작다. 즉, 완주를 하지 못한 사람은 항상 1명이다.

풀이

  • 해시를 활용하였으며, participant 배열에서 참가자의 이름을 중복 제거한 리스트를 생성하였다.
  • 해당 리스트로 딕셔너리를 만들어 {"참가자 이름" : 0} 형태로 값을 저장했다. 이 때 해시 값은 해당 참가자가 participant 배열에 언급된 숫자이다. 이를 통해 동명이인인 참가자를 파악할 수 있다.
  • 이후, completion 배열에 나타난 참가자의 해시 값을 1씩 감소시키면서, 최종적으로 해시 값이 1로 남은 참가자를 정답으로 return 했다.

코드

정답 1)

def solution(participant, completion):
    answer = ''
    
    p = list(set(participant))      # 참가자 배열을 set 연산하여 배열 p에 저장 (동명 이인이 있을 수 있으므로 set 연산을 통해 중복되지 않은 이름만 저장)
    
    hash = {}
    for i in p:     # hash를 만들어서 {"참가자 이름" : 0} 형태로 저장
        hash[i] = 0
    
    for i in participant:   # 참가자의 수만큼 hash 값을 갱신(1씩 추가, 동명이인인 경우 해시 값이 2 이상으로 표기됨)
        hash[i] += 1
    
    for i in completion:    # 완주한 참가자들의 해시 값을 1씩 감소시킴
        hash[i] -= 1
    
    for i in hash:      # 최종적으로 해시 값이 1인 참가자를 return (완주 못한 참가자임)
        if hash[i] == 1:
            return i

정답 2)

딕셔너리를 조금 다른 방법으로 선언 후 value 값을 지정했다.

import collections
def solution(participant, completion):
    
    hash = collections.defaultdict(int)
    for p in participant:
        hash[p] += 1
    
    for c in completion:
        hash[c] -= 1
    
    for val in hash:
        if hash[val] == 1:
            return val

👏 해시 문제를 마스터하자!

profile
👩🏻‍💻 AI를 좋아하는 IT학부생

0개의 댓글