def solution2(participant, completion):
# 1. 참가자의 hash 값을 구하고, 그걸 더해서 누적한다.
hashDict = {}
sumHash = 0
for part in participant:
hashDict[hash(part)] = part
sumHash += hash(part)
# 2. 완주자들의 해시값을 구해서 누적한 값에서 뺀다.
for comp in completion:
sumHash -= hash(comp)
return hashDict[sumHash]
보면 해시값이 고유의 숫자로 나오는 것을 이용해서 sum한 뒤 각 해시값을 빼서 특정 값을 찾는다.
def solution2(phone_book):
phone_hash = dict()
for i in phone_book:
phone_hash[i] = i # phone_hash[hash(i)] 로 하면 해시 값이 항상 달라짐
for nums in phone_book:
arr = ""
for num in nums:
arr += num
if arr in phone_hash and arr != nums:
return False
return True
보면 이번에는 phone_hash[hash(i)]로 사용 안하고 phone_hash[i]로 사용했다. 이 문제에서는 밸류값은 중요하지 않고 키를 이용하므로 키값을 보존하기 위해 hash(i)를 쓰지않고 그대로 사용했다.
def my_solution(nums):
N = len(nums) / 2
sort = {}
# sort = [0] * (max(nums) + 1)
for i in nums:
sort[i] = 1
print(sort)
cate = len(sort.keys())
print(cate)
if cate <= N:
return cate
else:
return N
이 문제에서는 len(sort)를 써도되는데, 이렇게 해서 키-밸류 쌍의 수를 계산해서 사용했다. 해시로 딕셔너리 타입을 만들면 키가 중복되지 않는 점을 이용했다.
def solution_1(num):
"""
나랑 비슷한데, 중복을 제거할 때 나는 딕셔너리로 했는데 set으로 숫자만 zip했다.
그리고 min을 써서 둘 중 비교를 쉽게 했다.
"""
return min(len(num)/2, len(set(num)))
훨씬 깔끔하고 미니멀하다.
def solution1(phone_book):
phone_book.sort()
print(phone_book)
for i in range(len(phone_book)-1):
if phone_book[i + 1].startswith(phone_book[i]):
return False
return True
A.startswith(a): a가 A의 접두사로 들어가는지 체크
from collections import Counter
def solution3(participant, completion):
answer = Counter(participant) - Counter(completion)
print(answer) # Counter({'leo': 1})
return list(answer.keys())[0]
Counter로 계산 후 키만 반환, 리스트로 변환, 첫번째 반환.