๐Ÿ“˜ TIL - LeetCode 706: Design HashMap

์ด์Šน์šฑยท2025๋…„ 8์›” 7์ผ

์ž๋ฐ”์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
4/33

๐Ÿ” ๋ฌธ์ œ ์š”์•ฝ

ํ•ด์‹œ๋งต(HashMap)์„ ๋‚ด์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ put, get, remove์˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” HashMap ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋‹ค.


๐Ÿ”ง ์š”๊ตฌ ๊ธฐ๋Šฅ

  • MyHashMap(): ํ•ด์‹œ๋งต์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • void put(int key, int value): ํ‚ค-๊ฐ’ ์Œ์„ ์‚ฝ์ž… ๋˜๋Š” ๊ฐฑ์‹ 
  • int get(int key): ํ•ด๋‹น ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ฐ’์„ ๋ฐ˜ํ™˜, ์—†์œผ๋ฉด -1
  • void remove(int key): ํ‚ค์™€ ๊ทธ์— ๋Œ€์‘ํ•˜๋Š” ๊ฐ’์„ ์‚ญ์ œ

๐Ÿ’ก ํ•ด๊ฒฐ ์ „๋žต

๋ฐฉ๋ฒ• 1: ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด ์‚ฌ์šฉ

  • key์˜ ๋ฒ”์œ„๊ฐ€ 0~1,000,000์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด ๊ธฐ๋ฐ˜ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • ๋ฐฐ์—ด ์ดˆ๊ธฐํ™” ํ›„ ๊ธฐ๋ณธ๊ฐ’์„ -1๋กœ ์„ค์ •
  • ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ณต๊ฐ„ ํšจ์œจ์„ฑ์€ ๋–จ์–ด์ง

๋ฐฉ๋ฒ• 2: ํ•ด์‹œ + ์ฒด์ด๋‹(์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ) ๋ฐฉ์‹

  • ํ•ด์‹œ ์ถฉ๋Œ์„ ๊ณ ๋ คํ•ด ๊ฐ ๋ฒ„ํ‚ท์— ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ €์žฅ
  • key % SIZE๋กœ ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ถฉ๋Œ ๋ฐฉ์ง€
  • Node ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ตฌ์„ฑ
  • ์ถฉ๋Œ์ด ์ ์œผ๋ฉด ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1)

๐Ÿง  ๋ฐฐ์šด ์ 

  • ํ•ด์‹œ๋งต์˜ ๋‚ด๋ถ€ ์ž‘๋™ ์›๋ฆฌ์™€ ์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฐฉ์‹์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ํ™•์‹คํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ์ฒด์ด๋‹ ๋ฐฉ์‹์€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ถฉ๋Œ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์ „์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๋ฐฐ์—ด ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์€ ๋งค์šฐ ๋‹จ์ˆœํ•˜์ง€๋งŒ ๊ณต๊ฐ„ ๋‚ญ๋น„๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.
  • ์ง์ ‘ ๊ตฌํ˜„ ์‹œ ํ•ด์‹œ ํ•จ์ˆ˜ ์„ค๊ณ„์™€ ์ž๋ฃŒ๊ตฌ์กฐ ์„ ํƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

๐Ÿ“Š ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„

์—ฐ์‚ฐ์‹œ๊ฐ„ ๋ณต์žก๋„์„ค๋ช…
putํ‰๊ท  O(1), ์ตœ์•… O(n)์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ถฉ๋Œ ์‹œ ๊ธธ์ด๋งŒํผ ํƒ์ƒ‰
getํ‰๊ท  O(1), ์ตœ์•… O(n)
removeํ‰๊ท  O(1), ์ตœ์•… O(n)
๊ณต๊ฐ„O(n)์ €์žฅ๋˜๋Š” ํ‚ค-๊ฐ’ ์ˆ˜์— ๋น„๋ก€

๐Ÿ’ป ์ฒด์ด๋‹ ๋ฐฉ์‹ ํ•ต์‹ฌ ์ฝ”๋“œ ์š”์•ฝ (Java)

private static final int SIZE = 10000;
private Node[] buckets;

private static class Node {
    int key, value;
    Node next;
    Node(int key, int value) {
        this.key = key;
        this.value = value;
    }
}

private int getIndex(int key) {
    return key % SIZE;
}
  • put: ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์„œ ์žˆ์œผ๋ฉด ๊ฐฑ์‹ , ์—†์œผ๋ฉด ์ถ”๊ฐ€
  • get: ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ key ์ผ์น˜ํ•˜๋Š” ๋…ธ๋“œ ํƒ์ƒ‰
  • remove: key์— ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐ

๐ŸŽฏ ๋А๋‚€ ์ 

  • ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์Šค์Šค๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๋‹ˆ ํ•ด์‹œ๋งต์ด ์–ผ๋งˆ๋‚˜ ํšจ์œจ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ธ์ง€ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ์ถฉ๋Œ ์ฒ˜๋ฆฌ, ๋ฒ„ํ‚ท ์‚ฌ์ด์ฆˆ, ํ•ด์‹œ ํ•จ์ˆ˜ ์„ค๊ณ„ ๋“ฑ ์‹ค์ œ ๊ตฌํ˜„์—์„œ ๊ณ ๋ คํ•  ์š”์†Œ๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ๋‹จ์ˆœํ•œ ๋ฐฐ์—ด ๊ธฐ๋ฐ˜ ๊ตฌํ˜„๋ถ€ํ„ฐ ์ฒด์ด๋‹ ๊ธฐ๋ฐ˜ ํ•ด์‹œ๋งต๊นŒ์ง€ ํ™•์žฅ ํ•™์Šต์ด ๊ฐ€๋Šฅํ•œ ์ข‹์€ ๋ฌธ์ œ์˜€๋‹ค.
profile
์•„๋Š”๊ฑฐ ์—†๋Š” ์ „๊ณต์ž

0๊ฐœ์˜ ๋Œ“๊ธ€