#4 완주하지 못한 선수:
date posted: 2020-04-15
오늘의 TMI
- B&O e8 1세대가 고장났지만 전여자친구가 사줬던거라 보증서 없음.
- B&O e8 3세대를 인터넷에서 사려는데 정품일까 걱정.
- 내일 퇴근하고 백화점에서 들러볼거.
- TMI 쓰는 파트가 가장 재밌음.
코딩 풀이 시작
해시 문제중 하나이기때문에 아마 메모리를 최대한 줄이는것에 신경을 써야할듯합니다.
# 1 시도
def solution(participant, completion):
for c in completion:
participant.remove(c)
return participant[0]
- 정확성 테스트는 모두 통과 했으나 효율성 테스트는 다 실패 하였습니다.
-
completion 의 선수는 participant 선수들보다 한명이 적으니 저희의 time complexity 는 O(n) = n 입니다.
- 제생각엔 O(n) = n 이 아니라 remove 할때 다시 선수이름을 participants 그륩에서 linear 타임으로 찾아야 하기때문에 O(n) = n^2 인거 같네요.
# 2 시도
- 아래코드는 {"leo":1, "kiki":0, "eden":0} 이런식으로 table이 만들어 집니다. leo의 카운트가 남았기때문에 leo 가 완주 하지 못했는데. 쟤만 딱 짚어주는 방법을 고민.
from collections import defaultdict
table = defaultdict(int)
for p in participants:
table[p] += 1
for c in completion:
table[c] -= 1
- {1: "leo", "kiki":0} 이런식으로 바꾸고 table[1] 을 return 하도록 해보자.
# 3 시도
- 각 선수마다 해쉬값을 만들어주고 해쉬값을 넣으면 선수이름이 나오는 테이블을 만들어야 한다.
- ex: leo -> hash(leo) = x -> hash_table[x] = leo
def solution(participant, completion):
hashkey = 0
hash_table = {}
for p in participant:
hash_table[hash(p)] = p
hashkey += int(hash(p))
for c in completion:
hashkey -= hash(c)
return hash_table[hashkey]
- 각 선수당 해쉬값을 정해주는 python의 hash function 이 있다. hash("leo") = 해쉬값
- 선수이름마다 hash 값을 받으면 hash_table[해쉬값] = 선수이름 을 넣어 hash_table을 만든다.
- 계속 hashkey 값에 선수의 hashkey 값을 더해주고 빼서 남은 hashkey값을 hash_table 에 넣어주면 그 남은값의 선수가 나올것.
물론 해쉬 함수를 직접 만들면 더 좋겟지만 그래도 이것이 가장 hash table 를 잘 이해하고 잘 사용하는것 같다.
# 1 alternative 풀이
- Counter["a", "a","b", "c"] --> {a:2, b:1, c:1}, 리스트에 있는 문자를 count 한 dictionary 만듬.
- {a:2, b:1, c:1} - {a:1, b:1} = {a:1, c:1}. 이런식으로 빼기도 가능
- 테이블을 만들라면 하나씩 loop 해야하는거 아닌가? 도대체 어떤식으로 만드는 건지 알수 없으니 직접 만들어 본다. # 2 시도 에서 보세요.
from collections import Counter
def solution(participant, completion):
answer = Counter(participant) - Counter(completion)
return list(answer.keys())[0]