Post

๐Ÿ“œ PS 01 - HashMap ๊ธฐ์ดˆ์™€ ๋นˆ๋„์ˆ˜ ๋ฌธ์ œ

๐Ÿ“œ PS 01 - HashMap ๊ธฐ์ดˆ์™€ ๋นˆ๋„์ˆ˜ ๋ฌธ์ œ

1์ฃผ์ฐจ 1์ผ์ฐจ - HashMap ๊ธฐ์ดˆ์™€ ๋นˆ๋„์ˆ˜ ๋ฌธ์ œ

์˜ค๋Š˜ ๋ชฉํ‘œ๋Š”:

โ€œHashMap์„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€โ€

๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ HashMap์€: ์‚ฌ์‹ค์ƒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋‹ค.

ํŠนํžˆ Java ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด:

  • ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ
  • ์ค‘๋ณต ์ œ๊ฑฐ
  • Key ๊ธฐ๋ฐ˜ ์กฐํšŒ
  • ์บ์‹œ ๊ตฌ์กฐ

๋“ฑ์„ ๋งค์šฐ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.


์˜ค๋Š˜ ํ•™์Šต ๋ชฉํ‘œ

์˜ค๋Š˜ ์ง‘์ค‘ํ•  ๋‚ด์šฉ:

  • HashMap ๊ธฐ๋ณธ ๋™์ž‘ ์ดํ•ด
  • Key/Value ๊ตฌ์กฐ ์ดํ•ด
  • ๋นˆ๋„์ˆ˜ ๋ฌธ์ œ ์ ์‘
  • containsKey/get ํ™œ์šฉ
  • ์‹œ๊ฐ„๋ณต์žก๋„ ๊ฐ๊ฐ ์ตํžˆ๊ธฐ

HashMap ํ•ต์‹ฌ ๊ฐœ๋…

HashMap์€:

Key ๊ธฐ๋ฐ˜ ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ๋Š”:

  • hashCode ๊ณ„์‚ฐ
  • Bucket ์ €์žฅ
  • equals ๋น„๊ต

๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„:

1
O(1)

์ˆ˜์ค€.


์™œ HashMap์ด ์ค‘์š”ํ•œ๊ฐ€?

์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ํŒจํ„ด:

  • ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ
  • ์ค‘๋ณต ์ฒดํฌ
  • ๋น ๋ฅธ ํƒ์ƒ‰

์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์˜ˆ์‹œ:

  • ์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜
  • ๋ฒ ์ŠคํŠธ์•จ๋ฒ”
  • ์˜์ƒ
  • ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก

๋“ฑ.


๋Œ€ํ‘œ ๋ฌธ์ œ ์œ ํ˜• 1 - ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ

๊ฐ€์žฅ ๊ธฐ๋ณธ ํŒจํ„ด.

์˜ˆ์‹œ:

  • ํŠน์ • ์ˆซ์ž๊ฐ€ ๋ช‡ ๋ฒˆ ๋“ฑ์žฅํ–ˆ๋Š”๊ฐ€?
  • ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ๋ฌธ์ž์—ด์€?

ํ•ต์‹ฌ ์ ‘๊ทผ ๋ฐฉ์‹

ํ•ต์‹ฌ ์‚ฌ๊ณ  ํ๋ฆ„:

โ€œ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•ด์•ผ ํ•œ๋‹คโ€

๋ผ๋ฉด:

HashMap<Key, Count>

๊ตฌ์กฐ๋ฅผ ๋– ์˜ฌ๋ ค์•ผ ํ•œ๋‹ค.


Java ์ฝ”๋“œ ์˜ˆ์‹œ

1
2
3
4
5
Map<String, Integer> map = new HashMap<>();

for (String s : arr) {
    map.put(s, map.getOrDefault(s, 0) + 1);
}

getOrDefault๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

๋งค์šฐ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

๊ธฐ์กด ๋ฐฉ์‹:

1
2
3
4
5
if (map.containsKey(key)) {
    map.put(key, map.get(key) + 1);
} else {
    map.put(key, 1);
}

๊ฐœ์„ :

1
map.put(key, map.getOrDefault(key, 0) + 1);

ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๋‹ค.


๋Œ€ํ‘œ ๋ฌธ์ œ ์œ ํ˜• 2 - ์ค‘๋ณต ์ œ๊ฑฐ

HashSet๊ณผ ํ•จ๊ป˜ ์ž์ฃผ ๋“ฑ์žฅ.

์˜ˆ์‹œ:

  • ์ค‘๋ณต ๋ฌธ์ž ์ œ๊ฑฐ
  • ์ค‘๋ณต ์ˆซ์ž ์ œ๊ฑฐ

ํ•ต์‹ฌ ํฌ์ธํŠธ

Hash ๊ธฐ๋ฐ˜ ์ž๋ฃŒ๊ตฌ์กฐ๋Š”:

์กฐํšŒ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค

๋”ฐ๋ผ์„œ: ์ค‘๋ณต ์ฒดํฌ ์ตœ์ ํ™”์— ๋งค์šฐ ๊ฐ•ํ•˜๋‹ค.


๋Œ€ํ‘œ ๋ฌธ์ œ ์œ ํ˜• 3 - Key ๊ธฐ๋ฐ˜ ํƒ์ƒ‰

์˜ˆ์‹œ:

  • ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก
  • ์˜์–ด ๋‹จ์–ด ๋งค์นญ
  • ์บ๋ฆญํ„ฐ ์ด๋ฆ„ ์กฐํšŒ

์‹œ๊ฐ„๋ณต์žก๋„ ๊ด€์ 

์ž˜๋ชป๋œ ๋ฐฉ์‹:

1
O(Nยฒ)

๋Œ€ํ‘œ ์˜ˆ์‹œ:

1
for + for ์ค‘์ฒฉ ํƒ์ƒ‰

HashMap ์‚ฌ์šฉ ์‹œ

๋Œ€๋ถ€๋ถ„:

1
O(N)

์ˆ˜์ค€๊นŒ์ง€ ๊ฐ์†Œ ๊ฐ€๋Šฅ.

์ด๊ฒƒ์ด HashMap์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋‹ค.


์™œ ์กฐํšŒ๊ฐ€ ๋น ๋ฅผ๊นŒ?

HashMap์€:

hashCode ๊ธฐ๋ฐ˜ Bucket ์ ‘๊ทผ

์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ: ๋ฐฐ์—ด ์ธ๋ฑ์Šค์ฒ˜๋Ÿผ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.


์‹ค๋ฌดํ˜• ๊ด€์ 

HashMap์€ ์‹ค๋ฌด์—์„œ๋„ ๋งค์šฐ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

๋Œ€ํ‘œ ์‚ฌ๋ก€:

  • ์บ์‹œ
  • ์‚ฌ์šฉ์ž ์„ธ์…˜
  • ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ ์กฐํšŒ
  • API ์‘๋‹ต ๋งคํ•‘

์ฆ‰:

์ฝ”๋”ฉํ…Œ์ŠคํŠธ + ์‹ค๋ฌด

๋‘˜ ๋‹ค ํ•ต์‹ฌ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.


์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜

1. NullPointerException

์ž˜๋ชป๋œ ์ฝ”๋“œ:

1
map.get(key) + 1

key๊ฐ€ ์—†์œผ๋ฉด null ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ.


ํ•ด๊ฒฐ

1
map.getOrDefault(key, 0)

์‚ฌ์šฉ.


2. containsKey ๋‚จ์šฉ

๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด: ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.


3. ์‹œ๊ฐ„๋ณต์žก๋„ ๊ณ„์‚ฐ ์‹ค์ˆ˜

HashMap์€ ํ‰๊ท :

1
O(1)

์ด์ง€๋งŒ:

์ตœ์•…์˜ ๊ฒฝ์šฐ:

1
O(N)

๊ฐ€๋Šฅ์„ฑ ์กด์žฌ.

๋‹ค๋งŒ ์‹ค์ „์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ ํ‰๊ท  ์„ฑ๋Šฅ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.


Trade-off ๊ด€์ 

HashMap ์žฅ์ 

  • ๋น ๋ฅธ ์กฐํšŒ
  • ๋น ๋ฅธ ์‚ฝ์ž…
  • ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ ์ตœ์ 

๋‹จ์ 

  • ์ •๋ ฌ ๋ณด์žฅ ์•ˆ ๋จ
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ๊ฐ€๋Šฅ
  • hash ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๋น„๊ต

Array

์žฅ์ :

  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ์ข‹์Œ

๋‹จ์ :

  • ํƒ์ƒ‰ ๋А๋ฆผ

HashMap

์žฅ์ :

  • ํƒ์ƒ‰ ๋น ๋ฆ„

๋‹จ์ :

  • ๋ฉ”๋ชจ๋ฆฌ ์ถ”๊ฐ€ ์‚ฌ์šฉ

์ฆ‰:

โ€œ์†๋„ vs ๋ฉ”๋ชจ๋ฆฌโ€

Trade-off ์กด์žฌ.


๋ฉด์ ‘์—์„œ ์„ค๋ช…ํ•œ๋‹ค๋ฉด?

์˜ˆ์‹œ ๋‹ต๋ณ€:

๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ๋ฌธ์ œ์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ HashMap์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ O(1) ์ˆ˜์ค€์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ์ „์ฒด ํƒ์ƒ‰ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ •๋„๊นŒ์ง€ ์„ค๋ช… ๊ฐ€๋Šฅํ•˜๋ฉด ์ข‹๋‹ค.


์ถ”์ฒœ ๋ฌธ์ œ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

  • ์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜
  • ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก
  • ์˜์ƒ
  • ๋ฒ ์ŠคํŠธ์•จ๋ฒ”

๋ฐฑ์ค€

  • ์ˆซ์ž ์นด๋“œ
  • ๋ฌธ์ž์—ด ์ง‘ํ•ฉ

์ถ”์ฒœ ํ’€์ด ์ˆœ์„œ

Step 1

  • ์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋นˆ๋„์ˆ˜ ๋ฌธ์ œ.


Step 2

  • ์ „ํ™”๋ฒˆํ˜ธ ๋ชฉ๋ก

Hash ๊ธฐ๋ฐ˜ ํƒ์ƒ‰ ๊ฐ๊ฐ ์ตํžˆ๊ธฐ.


Step 3

  • ๋ฒ ์ŠคํŠธ์•จ๋ฒ”

HashMap + ์ •๋ ฌ ์กฐํ•ฉ ์—ฐ์Šต.


์‹ค์ „ ํŒ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ:

โ€œ๋น ๋ฅธ ํƒ์ƒ‰์ด ํ•„์š”ํ•œ๊ฐ€?โ€

์‹ถ์œผ๋ฉด:

๊ฐ€์žฅ ๋จผ์ € HashMap ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ๋– ์˜ฌ๋ ค์•ผ ํ•œ๋‹ค.

์ด๊ฒƒ๋งŒ์œผ๋กœ๋„: ๋ฌธ์ œ ์ ‘๊ทผ ์†๋„๊ฐ€ ํฌ๊ฒŒ ๋นจ๋ผ์ง„๋‹ค.


ํ•ต์‹ฌ ์š”์•ฝ

์˜ค๋Š˜ ํ•ต์‹ฌ์€ ๋‹ค์Œ์ด๋‹ค.

  • HashMap์€ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ํ•ต์‹ฌ ์ž๋ฃŒ๊ตฌ์กฐ
  • ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ ๋ฌธ์ œ ๋งค์šฐ ์ค‘์š”
  • ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„ O(1)
  • getOrDefault ๋ฐ˜๋“œ์‹œ ์ต์ˆ™ํ•ด์งˆ ๊ฒƒ
  • ๋น ๋ฅธ ์กฐํšŒ ๋ฌธ์ œ์—์„œ HashMap ์šฐ์„  ๊ณ ๋ ค

ํŠนํžˆ ์ค‘์š”ํ•œ ๊ฑด:

โ€œ์™œ HashMap์„ ์„ ํƒํ–ˆ๋Š”๊ฐ€โ€

๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

This post is licensed under CC BY 4.0 by the author.