엔지니어 규의 IT 프로그래밍 다이어리

프로그래머스 : 해시 - 완주하지 못한 선수 본문

코딩테스트/python

프로그래머스 : 해시 - 완주하지 못한 선수

엔지니어 규 2023. 1. 16. 21:24
728x90

문제 설명

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

마라톤에 참여한 선수들의 이름이 담긴 배열 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

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

 

1. collections.Counter 함수의 존재를 알아야 한다.

 

import collections
a = ['a','a','a','b','b','c']
collections.Counter(a)
출력값 : Counter({'a': 3, 'b': 2, 'c': 1})

 

위처럼 list 내부의 원소의 개수를 count 해서 dict 형태로 변환해주는 사기적인 기능이다.

 

또한 이 객체들은 덧셈 뺄셈이 가능하다. 예를들면

 

a = ['a','a','a','b','b','c']
b = ['a','b','c','d','e']
collections.Counter(a) - collections.Counter(b)

Counter({'a': 2, 'b': 1})

c,d,e 는  a list 에 없기 때문에 있는 원소에 한해서만 뺄셈이 되어서 출력이 된다. 해당 pattern은 어느정도 외우도록 하자.

 

 

풀이2

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for p, c in zip(participant, completion):
        if p != c:
            return p
    return participant[-1]
cs

 

zip 기능을 이용 하였다.

 

여기서 참 재미있는것이 zip 은 list 의 배열이 서로달라도 짝짓기가 가능하다.

 

예를들면 a = [1,2,3,4,5], b= [1,2,3] 으로 배열의 길이가 달라도 zip(a,b) 가 가능하며,

 

짧은 배열을 기준으로 zip 된다.

 

 

풀이3

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
cs

hash 함수에 대해서 알아야 하는 풀이이다.

 

우선 파이썬에서 hash('str') 을 사용하면 일정길이의 숫자가 return 된다.

예를들면

a = ['apple','bannana','hat','코드']
dic = {}
for i in a:
    dic[hash(i)] = i
cs
{3971016712440575100: 'apple',
 -6506880872274404916: 'bannana',
 -3415871753867651093: 'hat',
 -3701313500097656757: '코드'}

dic 은 위처럼 출력이 된다.

 

 

 

728x90
Comments