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

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때,
완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

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

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

Counter함수를 사용하면 가장 간단하게 풀 수 있다.

collections.Counter(participant)

participant 배열을 값: 나온횟수 쌍으로 저장한 카운터 객체를 만든다. 이 객체끼리는 서로 더하고 뺄 수 있다.
answer.keys()는 dict_keys자료형이므로 list로 감싸서 자료형을 바꿔주고 첫번째 인수를 반환하도록 만들면 답이 된다.

다른풀이

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

sort()로 순서대로 정리해서 다른 부분 생기면 그걸 반환한다.

해시함수 이용한 풀이

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

hash(part)처럼 hash()로 감싸면 해시함수가 동작해서 특정한 긴 값을 할당하게 그 해시값을 key로 하고 value를 part로 해서 저장한다.
같은 문자열의 해시값은 똑같으므로 hash(com)을 빼주면 participant에만 존재하는 문자열의 해시값만 남게 되고 딕셔너리에서 찾아서 반환하면 답이다.

좋은 웹페이지 즐겨찾기