해시 함수란 임의 크기 데이터를 고정 크기 값으로 매핑하는 데 사용할 수 있는 함수.
즉 , ABC , 1245BC , AF32B 가 있어도 해시 함수를 통해 2바이트의 고정 크기 값으로 매핑 실킬 수 있다.
해시 함수에는 저장 방법에 따라 2가지 방식으로 나눌 수 있다.
다음의 기능을 제공하는 해시맵을 디자인하라.
class ListNode:
def __init__(self, key=None, value = None):
self.key = key
self.val = value
self.next = None
class MyHashMap:
# 초기화
def __init__(self):
self.size = 1000
self.table = collections.defaultdict(ListNode)
# 삽입
def put(self,key):
index = key % self.size
#인덱스에 노드가 없다면 삽입 후 종료
if self.table[index].value is None:
self.table[index] = ListNode(key,value)
return
#인덱스에 노드가 존재하는 경우 연결 리스트 처리
p = self.table[index]
while p:
if p.key == key :
p.value = value
return
if p.next in None:
break
p= p.next
p.next = ListNode(key,value)
# 조회
def get(self,key):
index = key % self.size
if self.table[index].value is None:
return -1
# 노드가 존재할 때 일치하는 키 탐색
p = self.table[index]
while p:
if p.key == key:
return p.value
p = p.next
return -1
# 삭제
def remove(self,key):
index = key % self.size
if self.table[index].value is None:
return
# 인덱스의 첫 번째 노드일 때 삭제 처리
p = self.table[index]
if p.key == key:
self.table[index] = ListNode() if p.next is None else p.next
return
# 연결 리스트 노드 삭제
prev = p
while p:
if p.key == key:
prev.next = p.next
return
prev , p = p , next
J는 보석이며, S는 갖고 있는 돌이다. S에는 보석이 몇 개나 있을까? 대소문자는 구분한다.
def numJewelsInStones(self, J,S):
freqs = {}
count = 0
# 돌(S)의 빈도 수 계산
for char in S:
if char not in freqs:
freqs[char] = 1
else:
freqs[char] += 1
# 보석(J)의 빈도 수 합산
for char in J:
if char in freqs:
count += freqs[char]
return count
def numJewelsInStones(self, J,S):
freqs = collections.defaultdict(int)
count = 0
# 비교 없이 돌(S)의 빈도 수 계산
for char in S:
freqs[char] +=1
# 비교 없이 보석(J)의 빈도 수 합산
for char in J:
count += freqs[char]
return count
def numJewelsInStones(self, J,S):
freqs = collections.Counter(S) #돌 빈도 수 계산
count = 0
for char in J:
count += freqs[char]
return count
def numJewelsInStones(self, J,S):
return sum(s in J for s in S)