728x90

LeetCode-706

Design HashMap : Design a HashMap without using any built-in hash table libraries.
note : At most 104 calls will be made to put, get, and remove.

Answer

        :::python

class ListNode: def init(self, key=None, value=None): self.key = key self.value = value self.next = Noneclass MyHashMap: def init(self): self.size = 10**4 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# Your MyHashMap object will be instantiated and called as such:# obj = MyHashMap()# obj.put(key,value)# param_2 = obj.get(key)# obj.remove(key)

Result : 234ms Memory: 20.6mb

문제 μ„€λͺ…

ν•΄μ‹œλ§΅(HashMap)을 κ΅¬ν˜„ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. ν•΄μ‹œλ§΅μ˜ put, get, remove λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

ν•΄μ‹œλ§΅μ€ ν‚€(Key)와 κ°’(Value)을 μ €μž₯ν•˜λŠ” μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€. ν‚€λŠ” μ€‘λ³΅λ˜μ§€ μ•ŠμœΌλ©°, 값은 쀑볡될 수 μžˆμŠ΅λ‹ˆλ‹€. put λ©”μ†Œλ“œλŠ” 킀와 값을 μ €μž₯ν•˜λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€. get λ©”μ†Œλ“œλŠ” 킀에 ν•΄λ‹Ήν•˜λŠ” 값을 λ°˜ν™˜ν•˜λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€. λ§Œμ•½ ν•΄λ‹Ήν•˜λŠ” 값을 찾을 수 μ—†μœΌλ©΄ -1을 λ°˜ν™˜ν•©λ‹ˆλ‹€. remove λ©”μ†Œλ“œλŠ” 킀에 ν•΄λ‹Ήν•˜λŠ” 값을 μ œκ±°ν•˜λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€.

각각의 λ©”μ†Œλ“œλ§ˆλ‹€ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(1) μ΄ν•˜μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.

ν•΄κ²° 방법

ν•΄μ‹œλ§΅μ„ κ΅¬ν˜„ν•˜λŠ” κ°€μž₯ κ°„λ‹¨ν•œ 방법은 ν•΄μ‹œ ν…Œμ΄λΈ”(Hash Table)을 μ΄μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 보톡은 λ°°μ—΄κ³Ό μ—°κ²° 리슀트둜 κ΅¬ν˜„λ©λ‹ˆλ‹€. 배열을 톡해 ν‚€λ₯Ό ν•΄μ‹œκ°’μœΌλ‘œ λ°”κΎΈμ–΄ 인덱슀둜 μ‚¬μš©ν•˜κ³ , μ—°κ²° 리슀트λ₯Ό μ‚¬μš©ν•˜μ—¬ 값듀을 μ €μž₯ν•©λ‹ˆλ‹€.

put λ©”μ†Œλ“œλŠ” ν‚€λ₯Ό ν•΄μ‹œκ°’μœΌλ‘œ λ°”κΎΈμ–΄ 인덱슀λ₯Ό κ΅¬ν•˜κ³ , ν•΄λ‹Ή 인덱슀의 μ—°κ²° λ¦¬μŠ€νŠΈμ—μ„œ ν‚€λ₯Ό μ°Ύμ•„ 값을 μ €μž₯ν•˜κ±°λ‚˜, μ—°κ²° λ¦¬μŠ€νŠΈκ°€ λΉ„μ–΄μžˆμ„ 경우 μƒˆλ‘œμš΄ λ…Έλ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

get λ©”μ†Œλ“œλŠ” ν‚€λ₯Ό ν•΄μ‹œκ°’μœΌλ‘œ λ°”κΎΈμ–΄ 인덱슀λ₯Ό κ΅¬ν•˜κ³ , ν•΄λ‹Ή 인덱슀의 μ—°κ²° λ¦¬μŠ€νŠΈμ—μ„œ ν‚€λ₯Ό μ°Ύμ•„ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€. λ§Œμ•½ ν•΄λ‹Ήν•˜λŠ” 값이 μ—†μœΌλ©΄ -1을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

remove λ©”μ†Œλ“œλŠ” ν‚€λ₯Ό ν•΄μ‹œκ°’μœΌλ‘œ λ°”κΎΈμ–΄ 인덱슀λ₯Ό κ΅¬ν•˜κ³ , ν•΄λ‹Ή 인덱슀의 μ—°κ²° λ¦¬μŠ€νŠΈμ—μ„œ ν‚€λ₯Ό μ°Ύμ•„ λ…Έλ“œλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.

ν•΄μ‹œλ§΅μ— μ‚¬μš©ν•˜λŠ” ν•΄μ‹œν•¨μˆ˜λŠ” ν•΄μ‹œκ°’μ΄ μΆ©λŒν•  κ°€λŠ₯성이 있기 λ•Œλ¬Έμ— μ€‘λ³΅λ˜λŠ” ν•΄μ‹œκ°’μ„ μ²˜λ¦¬ν•  수 μžˆλŠ” 방법이 ν•„μš”ν•©λ‹ˆλ‹€. 이 λ¬Έμ œμ—μ„œλŠ” chaining 방식을 μ‚¬μš©ν•˜μ—¬ μ—°κ²° 리슀트λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ μΆ©λŒμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

μ‚¬μš©μž μ½”λ“œ

μ‚¬μš©μž μ½”λ“œλŠ” μ •μƒμ μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€. μ μ ˆν•œ μžλ£Œκ΅¬μ‘°μ™€ λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ 각각의 λ©”μ†Œλ“œλ§ˆλ‹€ O(1) μ΄ν•˜μ˜ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 가지도둝 κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μž μ½”λ“œλŠ” κ°œμ„ ν•  여지가 μžˆμ§€λ§Œ, 제곡된 μ‘°κ±΄μ—μ„œλŠ” 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” μ½”λ“œμž…λ‹ˆλ‹€.

λ”°λΌμ„œ, μ‚¬μš©μž μ½”λ“œμ— λŒ€ν•œ ν‰κ°€λŠ” μ •μƒμ μœΌλ‘œ λ™μž‘ν•œλ‹€κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ°˜μ‘ν˜•

'🐒 One step' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[leetcode-217] Contains Duplicate  (0) 2023.05.11
How to LeetCode effectively  (0) 2023.05.10
[leetcode-38] Count and Say  (0) 2023.05.05
[leetcode-48] Rotate Image  (0) 2023.04.30
[leetcode-347] Top K Frequent Elements  (0) 2023.04.27
λ‹€ν–ˆλ‹€