from collections import Counter
def solution(participant, completion):
answer = ''
a=Counter(participant)
b=Counter(completion)
res=a-b
for i in a.keys():
if(res[i]>=1):
answer=i
return answer
처음 차집합을 사용하면 쉽게 풀릴 것이라고 생각하고 set()함수를 사용하여 집합으로 만든 뒤 p-c로 차집합을 실행했지만, 동명이인이 있을 경우의 오류가 생겼다.
집합으로 선언하면 중복이 불가능하여 동명이인의 한 명은 사라지게 된다.
그렇다면 중복이 있는지 없는지를 리스트에서 확인하려면 어떻게 해야할지 검색해보았다.
p=set(participant)
c=set(completion)
if len(participant) != len(p):
print("다름")
res=p-c
print(p)
# print(res)
print(*res)
print(str(*res))
파이썬 리스트에서 중복을 확인하는 방법을 찾아보니 리스트 중복을 출력하려면 파이썬 내장 모듈인 collections를 이용한다는 것을 알았다.
Counter 함수
"from collections import Counter"
Counter 함수를 이용하면 리스트 중복 갯수를 확인할 수 있다.
Counter는 딕셔너리의 서브 클래스로 딕셔너리처럼 사용할 수 있었다.
이때 아직 딕셔너리도 또한 차집합 개념을 사용할 수 있는지 모르고, 아래와 같이 코드를 작성하였다.
그리하여 나온 결과는 시간 초과 및 답도 맞지 않는 문제에 도달했다.
하지만 코드를 작성하면서 딕셔너리의 사용법에 대해 직접 작성해볼 수 있었다.
이전에 딕셔너리 문법에 대해 학습했지만 실제로 작성하면서 더 와닿았다. 확실히 하나씩 작성해보고 print 찍어보는게 기억에 남는 것 같다.
from collections import Counter
def solution(participant, completion):
answer = ''
a=Counter(participant)
b=Counter(completion)
for i in a.keys():
for j in b.keys():
if(i==j):
a[i]-=1
for i in a.keys():
if(a[i]>=1):
answer=i
return answer
이후, 차집합을 써보니, 바로 나오는 것을 보고 코드가 한 번에 줄었다. 그리하여 "풀이"에서 보는 것과 같은 코드를 제출하니 통과하였다.
해시를 사용하는 문제인 것을 알고 푸니 처음 접근을 해시를 이용해서 하고자 생각하다보니 더 접근하기 어렵다는 생각이 들었다. 해시 문제를 하나씩 풀면 감이 올 것이라 생각이 든다.