반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

멋진 개발자가 되고 싶다

[LeetCode,Python] 706. 해시 맵 디자인(Design HashMap) 본문

Algorithm Study/leetcode

[LeetCode,Python] 706. 해시 맵 디자인(Design HashMap)

오패산개구리 2021. 7. 17. 16:37
728x90
반응형

Design a HashMap without using any built-in hash table libraries.

Implement the MyHashMap class:

  • MyHashMap() initializes the object with an empty map.
  • void put(int key, int value) inserts a (key, value) pair into the HashMap. If the key already exists in the map, update the corresponding value.
  • int get(int key) returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key.
  • void remove(key) removes the key and its corresponding value if the map contains the mapping for the key.

 

 

** 깔끔한 답안 **

 

1. 개별 체이닝 방식을 이용한 해시 테이블 구현

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import collections
 
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:
        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 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[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
cs

 

해설:

 

개별 체이닝 방식을 적용하기 위해

 

딕셔너리 안에 연결 리스트를 입력하는 방식으로 진행한다.

 

딕셔너리는 존재하지 않는 인덱스를 조회할 때

 

에러를 발생하지 않고 바로 디폴트 객체를 생성하기 위해 defaultdict를 이용했다.

 

연결 리스트에는 key, value 그리고 index가 중복되는 경우

 

줄줄이 사탕처럼 리스트를 연결하기 위해 next도 만들어줬다.

 

next는 평소엔 굳이 쓸 이유가 없으니 None으로 지정해준다.

 

 

인덱스의 경우

 

해시 함수를 나눗셈 방식으로 구현하였고

 

사이즈를 1000 정도로 적절히 지정하여 key / 1000을 인덱스로 지정해줬다.

 

 

 

 

 

[출처: 파이썬 알고리즘 인터뷰(박상길 지음 /정진호 일러스트 /출판사 책만)]

728x90
반응형