완주하지 못한 선수
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" |
소스
# 효율성 테스트 부적합
def solution1(participant, completion):
for i in completion:
participant.remove(i)
return participant[0]
# 정확성, 효율성 통과
def solution2(participant, completion):
participant.sort()
completion.sort()
for i in range(len(participant)):
if i == len(participant) - 1:
return participant[i]
if participant[i] != completion[i]:
return participant[i]
# 정확성, 효율성 통과 Counter()활용
import collections
def solution3(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
# 정확성, 효율성 통과 hash()활용
def solution4(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
# 정확성, 효율성 통과 zip()활용
def solution5(participant, completion):
participant.sort()
completion.sort()
for p, c in zip(participant, completion):
if p != c:
return p
return participant[-1]
solution1 같은 경우 반복문을 통하여 리스트의 항목을 1개씩 삭제하여 마지막 남은 값을 추출하는 방법입니다. 이 방법으로 할 경우 효율성 부적합이라는 판정을 받게 됩니다. 1개씩 삭제하게 될 경우 remove()라는 내장 함수 안에서 도 매번 돌아가면서 찾고 삭제하고 이렇게 계속 반복하게 되므로 비효율적입니다.
solution2 같은 경우 리스트 2개를 정렬하여 반복문을 통해 각각의 값들을 검사하여 맞지 않는 경우 이경우는 participant의 값이 이문제에서 구하는 완주하지 못한 선수를 의미하게 되므로 이경우를 추출하여 리턴하고
이렇게 검사를 다하고도 participant의 마직막값을 검사할 때까지 안 나온 경우 이선수가 찾는 선수가 되므로 이 값을 리턴해주면 됩니다. solution5 도 이방법과 같은 논리로 흘러가지만 반복문에서 zip() 함수를 썼다는 점에서 차별점이 있습니다.
solution3같은 경우 collections모듈의 Counter() 함수를 사용하여 answer에 각각의 Counter 딕셔너리를 빼줘 완주하지 못한 선수만 1 값을 가지게 됩니다. 그 후 이 딕셔너리의 키값만을 가져와 리스로 변환하여 0번째 인덱스인 완주하지 못한 선수를 추출해주면 끝입니다.
https://docs.python.org/3/library/collections.html#collections.Counter
solution4 같은 경우 hash() 함수를 사용하여 각 값들을 고유한 숫자의 키값을 가지는 딕셔너리를 만들게 됩니다. 이와 동시에 그 수들을 temp에 더하여 다음 반복문을 통하여 그 수들의 뺄 경우 결과적으로 완주하지 못한 선수의 키값이 나오게 됩니다. 그 키값을 통하여 딕셔너리에 접근을 하여 값을 리턴해주면 끝입니다.
'파이썬 > 프로그래머스' 카테고리의 다른 글
위장 (0) | 2022.02.16 |
---|---|
전화번호 목록 (0) | 2022.02.15 |
코딩테스트 연습 - 문자열 내 p와 y의 개수 (0) | 2022.02.14 |
코딩테스트 연습 - 짝수와 홀수 (0) | 2022.02.14 |
코딩테스트 연습 - 서울에서 김서방 찾기 (0) | 2022.02.14 |