문제 링크

문제 설명

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

마라톤에 참여한 선수들의 이름이 담긴 배열 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"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

코드

sol1) 딕셔너리를 이용한 풀이

def solution(participant, completion):
    temp = {} # key,value를 가진 딕셔너리 이용

    #딕셔너리에 참가자 이름(key)과 해당 이름 사람수(value) 넣기 
    for i in participant :
        if i in temp : # 딕셔너리에서 in을 쓰면 key값이 있는지를 묻는 것
            temp[i]+=1
        else: 
            temp[i] =1
    
    #완주자 이름(key)의 value가 1이면 지우기, 동명이인이면 -1  
    for i in completion :
        if temp[i]==1 : 
            del temp[i]
        else : 
            temp[i] -=1

    #딕셔너리를 리스트로 바꾸고 가장 첫번째꺼 리턴(어차피 하나뿐)
    return list(temp.keys())[0]

sol2) 딕셔너리의 get을 이용한 풀이

  • dic.get(key) : key값에 대응하는 value값을 출력한다. 이는 dic[key]와 같으나 만약 없는 key값을 출력하라고 하면 dic[key]는 error를 출력하고, dic.get(key)는 None을 출력함. 만약 해당 key가 없을 때 반환되는 값을 바꾸 고 싶다면, get() 메소드의 두번째 인자로 주면 됨.
def solution(participant, completion):
    dic = {}
    for x in participant:
        dic[x] = dic.get(x,0) + 1 # dic에 key값으로 x가 있으면 x에 대응하는 value를 출력하고 없으면 0을 출력 #O(n)
    for x in completion:
        dic[x] -= 1                # O(n)
    sol = [k for k, v in dic.items() if v > 0]  #O(n)
    answer = sol[0]
    return answer

 

sol3) 딕셔너리를 사용한 후 sorted를 이용한 풀이

def solution(participant, completion):
    dic = {}
    for i in participant:
        if i not in dic:
            dic[i] = 1
        else:
            dic[i] += 1
    for j in completion:
        dic[j] -= 1
        
    sol = sorted(dic.items(), key = lambda x: x[1], reverse = True)
    return sol[0][0]

sol4) zip을 이용한 풀이

  • zip : 배열을 같은 인덱스끼리 짝지어준다. 만약 배열의 길이가 다를 경우 같은 인덱스끼리만 짝지어주고, zip 객체에서 나머지 인덱스는 제외된다.
def solution(participant, completion):
    participant.sort()  # O(nlogn)
    completion.sort()   # O(nlogn)
    for p,c in zip(participant, completion):
        if p != c:
            return p
    return participant[-1] # 모두 일치하면 사람수가 하나 더 많은 participant의 마지막 번호의 사람이 완주못한 것

sol5) Counter()를 이용한 풀이

  • collections.Counter: 원소의 수를 딕셔너리 형태로 출력함. 딕셔너리는 차집합이 불가능하지만 Counter내의 딕셔너리는 차집합이 가능함.
import collections
def solution(participant, completion):
    sol=collections.Counter(participant) - collections.Counter(completion)
    return list(sol.keys())[0]

sol6) 해시함수 이용 2번째 방법

  • hash('a') # 해당 value에 해당하는 hash값을 출력해줌

       >>> 3338796687179829302

def solution(participant , completion):
    Dic ={}
    sum = 0
    for part in participant:
        Dic[hash(part)] = part  # {숫자:'참가자'} 형태의 딕셔너리를 만듦
        sum += hash(part)       # 해당 참가자에 해당하는 key겂인 숫자를 더해준다
        
    for comp in completion:
        sum -=hash(comp)       # 완주한 사람에서 해당하는 key값인 숫자를 빼준다
    return Dic[sum]          # 남은 숫자의 key에 대응하는 값이 완주 못한 사람임

 

 

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

'프로그래머스 > lv1' 카테고리의 다른 글

lv1 체육복  (0) 2022.09.22
lv1 예산  (0) 2022.09.21

+ Recent posts