import collections
class Hashmap:
def __int__(self):
self.size = 1000
# 존재하지 않는 키를 조회할 경우 자동으로 디폴트를 생성 : collections.defaultdict()
self.table = collections.defaultdict(ListNode)
def put(self, key: int, value: int) -> None:
index = key % self.size
# 인덱스에 노드가 없다면 삽입 후 종료
'''
self.table[index] is None 이 아닌이유 ? ( 굳이 value 를 찾아 비교한 이유 )
-> collections.defaultdict(ListNode) 때문
위는 존재하지 않는 인덱스로 조회를 시도할 경우 에러를 발생하지 않고 그 자리에서 바로 디폴트
객체를 생성, 여기서는 defaultdict(ListNode) 로 선언하여서 존재하지 않는 인덱스를
조회할 경우 바로 빈 ListNode 를 생성한다.
즉 디폴트객체를 생성하였을 수도 있으니 value 값으로 확인을 해뵈야함
'''
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 is None:
break
p = p.next
p.next = ListNode(key, value)
def get(self,key: int) -> int:
index = key % self.size
if self.table[index].value is None:
return -1
# 노드가 존재할 경우 일치하는 키 탐색
p = self.table[key]
while p:
if p.key == key:
return p.value
# 연결리스트로 연결하기 위해 p 값을 다음값으로 업데이트
p = p.next
return -1
def remove(self,key: int) -> None:
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 next is None else p.next
return
# 연결 리스트 삭제
prev = p
while p:
if p.key == key:
prev.next = p.next
return
prev, p = p, p.next
if self.table[index].value is None:
self.table[index] = ListNode(key, value)
return
-> 즉 defaultdict 로 인해 생성된 "빈 객체의 공간" 인지 확인을 해주는 것!!