class ListNode:
def __init__(self, key=None, value=None):
self.key = key
self.value = value
self.next = None
class MyHashMap:
def __init__(self):
self.size = 1000
self.table = collections.defaultdict(ListNode)
def put(self, key: int, value: int) -> None:
# 문제에서 편의상 모든 키를 정수형으로 지정
# size 개수만큼 나머지 연산을 한 값을 해시값으로 정함
# 나머지 연산은 해시 테이블의 가장 기본적인 해싱방식
index = key % self.size
# 인덱스에 노드가 없다면 삽입 후 종료
# defaultdict은 존재하지 않는 인덱스 접근시 디폴트 객체를 생성하기 때문에
# table[index].value 로 검사한다. (table[index] is None 은 안됨)
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
# p.next가 None이면 아무것도 하지 않고 빠져나간다.
# 이것을 처리하지 않으면 p = p.next로 인해 p는 None이 되기 때문에
# p.next = ListNode(key, value) 여기서 에러가 발생한다.
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 == 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: 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 p.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
댓글남기기