https://programmers.co.kr/learn/courses/30/lessons/42576
def solution(participant, completion):
partc = dict()
for runner in participant:
if not runner in partc:
partc[runner] = 1
else:
partc[runner] += 1
for runner in completion:
partc[runner] -= 1
if partc[runner] == 0:
partc.pop(runner)
return list(partc.keys())[0]
정확성 테스트
테스트 1 〉 통과 (0.01ms, 10.2MB)
테스트 2 〉 통과 (0.01ms, 10.2MB)
테스트 3 〉 통과 (0.19ms, 10.2MB)
테스트 4 〉 통과 (0.65ms, 10.3MB)
테스트 5 〉 통과 (0.60ms, 10.3MB)
효율성 테스트
테스트 1 〉 통과 (28.50ms, 21.7MB)
테스트 2 〉 통과 (40.36ms, 25.2MB)
테스트 3 〉 통과 (44.95ms, 27.6MB)
테스트 4 〉 통과 (61.26ms, 33.9MB)
테스트 5 〉 통과 (57.18ms, 33.8MB)
채점 결과
정확성: 50.0
효율성: 50.0
합계: 100.0 / 100.0
딕셔너리의 key또는 item을 list()함수에 돌리면 iterable..
처음 생각한 풀이는 다음과 같았다.
def solution(participant, completion):
participant = set(participant)
return list(participant.difference(completion))[0] #difference 메소드가 인자로 iterable을 받기에 사용함, completion 도 집합으로 선언하고 차집합으로 구하는 방법도 있음
파이썬의 집합에서 차집합을 찾아내는 메소드인 .difference()를 사용하여
전체 참가자중 완주한 사람들을 제외하면 완주하지 못한 사람이 나오므로 위와 같이 작성했으나,
3번 예제에서 문제가 발생했다.
participant | completion | reutrn |
---|---|---|
["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |
예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만,
완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.
경주에서 동명이인이 있을때 집합은 중복을 제거하므로,
예제 3번에서 집합에 아무것도 남지않아 오류가 발생한다.
동명이인이 얼마나 있을지 모르기에
나는 participant 리스트를 돌면서 딕셔너리에 이름이 나온 횟수를 저장하고,
completion 리스트를 돌면서 딕셔너리에 저장된 횟수를 하나씩 줄였다.
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
위 코드가 이 문제에 가장 많은 좋아요를 받은 풀이이다.
4줄짜리 코드로, 매우 깔끔하고 아마 문제에서 의도한 코드에 가깝지 않나 생각한다.
처음에 내가 집합으로 풀이를 시도했던 코드와 유사하다.
파이썬 내장 라이브러리인 collections엔 Counter 클래스가 있다.
이름 그대로 iterable 또는 mapping(딕셔너리)에서 요소의 개수를 세어주는 동작을 한다.
문자열에서 문자가 몇번 등장하는지, 리스트에서 요소가 몇번 등장하는지 세야할때 주로 사용된다.
Counter는 딕셔너리의 서브 클래스로 이루어져 있다. 요소가 key로 저장되고, 개수가 value로 저장된다.
Counter는 합연산, 차연산 등을 수행 할 수 있다.
https://infinitt.tistory.com/183
Counter에서 갯수가 0이면 요소가 삭제되는 것 처럼 보인다.(공식 문서에서는 완전삭제하려면 del 메소드를 사용하란다.)
내 코드가 다른 코드들 보다 조금은 빠르게 동작한다는 것에 위안을 삼는다 😇