본문 바로가기
🖥️ 문제 풀이/프로그래머스

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

by 뒬탕 2022. 9. 27.
반응형

프로그래머스 해답 및 해설

 

문제 : 완주하지 못한 선수

바로가기

 

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 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"

 

해답 및 해설

파이썬 (Python)

def solution(participant, completion):
    dic = {}
    
    # participant에 이름 몇번 나왔는지 사전에 추가
    for name in participant:
        if name in dic:
            dic[name] += 1
        else:
            dic[name] = 1
    
    # completion에 나온 이름은 빼준다
    for name in completion:
        if dic[name] == 1:
            del dic[name]
        else:
            dic[name] -= 1
    
    # 마지막까지 남아있는 이름이 답
    answer = next(iter(dic.keys()))
    return answer

 participant 리스트에 이름이 몇 번 나왔는지 key를 이름으로 설정해 사전에 넣어준다. 그 후 completion 리스트에 이름이 나올 때마다 사전에서 이름을 빼준다. 마지막까지 남아있는 이름이 바로 완주하지 못 한 사람이다.

 

import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

 다른 사람들의 풀이를 보니 collections.Counter라는 리스트에서 원소가 나온 횟수를 사전처럼 만들어주는 해법도 있었다. 이런 라이브러리도 알아두자.

 

def solution(participant, completion):
    answer = ''
    temp = 0
    dic = {}
    for part in participant:
        dic[hash(part)] = part
        temp += int(hash(part))
    for com in completion:
        temp -= hash(com)
    answer = dic[temp]

    return answer

해쉬값을 아예 다 더해버린 다음 빼버리는 해법도 존재했다. 하지만 해쉬 충돌이 일어나면 풀리지 않을 듯 하다.

 

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[len(participant)-1]

아니면 두 리스트를 정렬한 다음, 두 리스트에서 원소가 다른 경우 participant 리스트의 원소가 답이라고 푸는 경우도 있었다.

반응형

댓글