https://programmers.co.kr/learn/courses/30/lessons/42576?language=python3
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
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" |
우선 자바스크립트 문법이 익숙하니 자바스크립트로 먼저 풀어보았다. 자바스크립트로는 생각보다 쉽게 풀 수 있었다.
function solution(participant, completion) {
participant.sort();
completion.sort();
for(var i=0; i < participant.length; i++){
if(participant[i] !== completion[i]){
return participant[i];
}
}
}
.sort((a,b) => a - b))
파이썬을 배우고 있는 단계이므로 문법이 아직 약하다.
파이썬에도 !==와 같은 대소비교가 있는 줄 알았는데 파이썬에는 !=밖에 없었다. 그래서 자바스크립트처럼 풀었더니 에러가 발생하였다.
그래서 !=를 통한 대소비교를 하고 마지막 인덱스 전 까지 다 같다면 마지막 인덱스가 다른 값이므로 리턴한다.
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배열을 가지고 Hash맵을 만든다. 선수의 이름을 Hash로 변환 후 Hash값을 key로 하고 선수 이름을 value로 하는 Dictionary를 만든다.
participant를 hash로 만든 key값을 다 더한다.
completion 배열을 돌면서 해당하는 hash값을 participant key의 총합에서 뺀다.
남은 값이 완주하지 못한 선수의 hash값이 된다.
def solution(participant, completion):
hashDict = {}
sumHash = 0
# participant list의 hash를 구하고 hash값을 더한다.
for part in participant:
hashDict[hash(part)] = part
sumHash += hash(part)
# completion list의 hash를 빼준다
for comp in completion:
sumHash -= hash(comp)
# 남은 값이 완주하진 못한 선수의 hash값이 된다.
return hashDict[sumHash]
print(solution(["leo", "kiki", "eden"], ["eden", "kiki"]))
파이썬에서는 collection이라는 모듈안에 Counter라는 Built-in Class가 있는데 이 클래스는 리스트를 딕셔너리로 변환해서 각각의 요소가 몇개 있는지 셀 수 있다.
from collections import Counter
def solution(participant, completion):
answer = Counter(participant) - Counter(completion)
return list(answer.keys())[0]
print(solution(["leo", "kiki", "eden"], ["eden", "kiki"]))
Counter{{'leo': 1}}
Counter{{'leo': 1}}.keys() => dic_keys(['leo'])
list(dic_keys(['leo'])) => ['leo']