https://programmers.co.kr/learn/courses/30/lessons/42576
1. list이용 (효율성X)
처음에는 리스트의 원소를 비교하는 방법으로 해결했다. participant와 completion에 공통으로 들어있는 이름을 지워서 최종적으로 participant에 남아있는 즉, 완주하지 못한 사람을 return하였다. 그러나 이 방법은 효율성 검사에서 fail됐다.
2. Dictionary(=hash)이용
두번째는 일일이 비교하는 리스트가 아닌 해시 방법을 이용하였다. participant에 이름이 있는 사람에게 일괄적으로 1을 할당하고 만약 동명이인인 경우 1을 추가적으로 할당한다. 동명이인을 고려하기 위해 a.get(i, 0)이 필요한 것이다. a.get(i)는 딕셔너리 a내의 key값이 i인 value를 들고오라는 뜻이다. 즉 a[i]를 말한다. ★get은 i에 해당하는 값이 없을 경우, 대체값을 지정할 수 있다. a.get(i, 0)은 a에서 key가 i인 값을 들고오고 만약 없으면 0을 들고오라는 기능을 갖는다.
(참고URL : wikidocs.net/16#key-valueget)
추가로 if a[i]: 은 a[i] == True이면 이라는 의미로 a[i] == 1과 같다. 반대로 a[i] == False라는 것은 a[i] == 0임을 뜻한다.
3. collections모듈 이용
collections.Counter은 리스트내의 각 원소가 몇개인지를 dictionary형태로 저장한다. collections.Counter은 뺄셈기호로 같은 key에 대한 value를 연산할 수 있으며 value값이 0이 되면 dictionary에서 삭제된다. 따라서 participant를 collections.Counter한 것에서 completion를 collection.Counter한 것을 빼면 완주한 사람의 key와 value쌍은 없어지고 완주하지 못 한 사람의 key와 value쌍이 남는다. return값으로 리스트에 남아있는 key값을 반환하면 된다.
'알고리즘 > 해시' 카테고리의 다른 글
#25 [파이썬] 프로그래머스: 위장 (0) | 2021.06.28 |
---|
댓글