99클럽 코테 스터디 두번째 문제!
오늘의 주제도 해시이고,
<완주하지 못한 선수>
문제
입력과 출력
코드
from collections import Counter
def solution(participant, completion):
answer=Counter(participant)-Counter(completion)
return list(answer.keys())[0]
알고리즘
participant -> 마라톤 참가자
completion -> 마라톤 완주자
참가자 중에 완주자에 이름이 없는 사람이 완주하지 못한 선수이다.
그러므로 counter 객체를 사용해서 배열안의 사람들이 몇번씩 나타나는지 알아본다 -> 동명이인 확인!!
동명이인이 있거나 completion에 없는 사람이 있다면 answer에 남을 것이고, 이를 반환하면 완성!
처음 문제를 받자마자 not in을 시도했다!! 그러나 동명이인을 확인하기에 좋은 방법이 아니라고 생각했고, 이번에도 서칭을 통해 파이썬의 함수 counter에 대해 알게됐다!
마지막으로는 출력할때 다시 헷갈렸는데, list(answer.keys())[0] 이 부분을 완성시키느라 헤맸다.. counter를 사용하면 딕셔너리 타입은 아니지만, 형태가 딕셔너리처럼 키값:등장횟수 로 나타내져서 key를 쓰면 될것 같다고 생각했지만 오류가 났다.
당연한 결과지만.. ㅎㅎ
그래서 여러 방법을 시도하다가
일단은 [key]라고 쓰는 게 잘못된 듯해서 찾아보니 키값을 나타내는 함수는 .keys()였고 이를 list로 반환하여 출력하였더니 성공했다!
다른 사람에게는 간단한 방법이였을지 모르지만 ㅎㅎ 나는 새로 배운것같아 의미있는 시간이었다 ~.~
이렇게 마무리하려 했지만 이번 문제를 이렇게만 풀기에는 뭔가 아쉬웠다..! 그래서 다른 풀이 방법을 알아냈고, 오히려 이게 나한테 더 잘맞는 부분이라고 생각했다.
또 다른 풀이 방법
다른 분의 코드를 참고했다!
def solution(participant, completion):
participant.sort()#배열비교가 저렇게 해서 가능한건가 했는데 sort가 됐기 때문에 가능!!
completion.sort()
for i in range(len(completion)):
if participant[i] != completion[i]: #not in 으로 썼더니 오류.
return participant[i]
return participant[-1]
처음엔 for문 안에 not in으로 작성했었는데, 이렇게 하면 오류가 나고 배열비교를 했더니 오류가 나지 않았다. 이부분이 이해가 되지 않았는데, sort를 깜빡하고 있었던것..!
sort로 배열을 정렬시켰기 때문에 양쪽 배열의 순서는 같을 것이므로 둘을 completion길이만큼 비교를 해서 다른 부분이 없었다면 participant에 남아있는 마지막부분이 답이 될것이다.
그러므로 이부분은 return participant[-1] !!
Something new I learned
(1) Counter 함수: 위에서 설명했으므로 기능은 생략하고, Counter({'h': 1, 'e': 1, 'l': 3})
이런 식으로 대괄호를 안에 넣으면 키로 값을 읽을 수 있다고 한다!
(2) sort 함수
(3) 이 문제를 풀면서 처음 정확성과 효율성에 대해 알게되었는데, 어느정도가 높은건지 도저히 모르겠다.... 첫번째 풀이는 확인하지 못했고 두번째 풀이에서 처음 확인했는데
채점 결과
정확성: 58.3
효율성: 41.7
합계: 100.0 / 100.0
이렇게 나왔다.. 이러면 괜찮은건가? 아무리 검색해봐도 어느정도로 나와야하는 건지 잘 모르겠어서 이 부분에 대해 좀 더 알아보려 한다!
To do list