๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/์ž๋ฃŒ๊ตฌ์กฐ ์ด๋ก 

HashMap - ์ž๋ฃŒ๊ตฌ์กฐ

by sh119 2024. 6. 20.

๋ชฉ์ฐจ 

1. HashMap์ด๋ž€?

2. ํ•ด์‹ฑ

3. ๋ฒ„ํ‚ท

4. ์ถฉ๋Œ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

  4-1) ์ฒด์ด๋‹

  4-2) ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ

     4-2-1) ์„ ํ˜•ํƒ์‚ฌ

     4-2-2) ์ด์ฐจํƒ์‚ฌ

     4-2-3) ์ด์ค‘ํ•ด์‹ฑ

5. HashMap์˜ ์ฃผ์š” ๋ฉ”์†Œ๋“œ

6. ์„ฑ๋Šฅ ํŠน์„ฑ (์‹œ๊ฐ„๋ณต์žก๋„ / ๊ณต๊ฐ„๋ณต์žก๋„)

7. HashMap VS HashTable

8. ๋ฌธ์ œํ’€์ด 


๐Ÿ‘ฉ‍๐Ÿ’ป HashMap ์ด๋ž€? 

HashMap ์€ Key์™€ Value๊ฐ€ ์Œ์„ ์ด๋ค„ ์ €์žฅ๋˜๋Š” ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

๊ฐ key๋Š” ๊ณ ์œ ํ•˜์—ฌ ์ค‘๋ณต๋œ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉฐ key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹นํ•˜๋Š” Value์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

โœ๏ธ ํ•ด์‹ฑ (Hashing)

* Hash Map์˜ ํ•ต์‹ฌ์ด ๋˜๋Š” ์›๋ฆฌ๋กœ ํ‚ค๋ฅผ ํŠน์ • ๊ณ„์‚ฐ์‹์— ๋„ฃ์–ด ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

(ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ํ•ด์‹œ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉฐ ์ด ํ•ด์‹œ ์ฝ”๋“œ๋Š” HashMap ๋‚ด๋ถ€์˜ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ๋œ๋‹ค. )

์ฆ‰, ํ‚ค๊ฐ€ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด์˜ ํŠน์ • ์œ„์น˜์— ๋งคํ•‘๋œ๋‹ค.

- ํ•ด์‹ฑ ํ•จ์ˆ˜ :ํ‚ค๋ฅผ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋งคํ•‘ํ•˜๋Š” ์—ฐ์‚ฐ

- ํ•ด์‹œ ํ…Œ์ด๋ธ” : ํ‚ค-๊ฐ’์„ ์—ฐ๊ด€์‹œ์ผœ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

 

โœ๏ธ ๋ฒ„ํ‚ท (Bucket)

๊ฐ™์€ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ–๋Š” ํ‚ค-๊ฐ’ ์Œ๋“ค์€ ๊ฐ™์€ ๋ฒ„ํ‚ท์— ์ €์žฅ๋œ๋‹ค. ๊ฐ ๋ฒ„ํ‚ท์€ ๋ฐฐ์—ด์˜ ์Šฌ๋กฏ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋‚˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.

 

โœ๏ธ ์ถฉ๋Œ ์ฒ˜๋ฆฌ(Collision Handling)

ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๋“ค์— ๋Œ€ํ•ด ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐฉ๋ฒ•์€ ์ฒด์ด๋‹(Chaining)๊ณผ ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ (Open Addressing)์ด๋‹ค. ์ฒด์ด๋‹์€ ๊ฐ ๋ฒ„ํ‚ท์ด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ณ , ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ์€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋นˆ ์Šฌ๋กฏ์„ ์ฐพ์•„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

1)  ์ฒด์ด๋‹(Chaining) 

์ฒด์ด๋‹์€ ๊ฐ ๋ฒ„ํ‚ท์ด ํ•˜๋‚˜์˜ ์Šฌ๋กฏ์ด ์•„๋‹ˆ๋ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)๋‚˜ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์Šฌ๋กฏ์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  ๋ฆฌ์ŠคํŠธ์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

์žฅ์ 

  • ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ๊ฝ‰ ์ฐจ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.
  • ์‚ญ์ œ๊ฐ€ ๊ฐ„๋‹จํ•˜๋‹ค.

๋‹จ์  : 

  • ์™ธ๋ถ€ ์ €์žฅ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.
  • ๋งŽ์€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ธธ์–ด์ ธ์„œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. 

2)  ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ(Open Addressing)

์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ์€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค๋ฅธ ๋นˆ ์Šฌ๋กฏ์„ ์ฐพ์•„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฃผ์š” ๊ธฐ๋ฒ•์œผ๋กœ๋Š” 1. ์„ ํ˜• ํƒ์‚ฌ(Linear Probing), 2. ์ด์ฐจ ํƒ์‚ฌ(Quadratic Probing), 3. **์ด์ค‘ ํ•ด์‹ฑ(Double Hashing)**์ด ์žˆ๋‹ค.

2-1) ์„ ํ˜• ํƒ์‚ฌ (Linear Probing)

์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ •ํ•ด์ง„ ๊ฐ„๊ฒฉ(๋ณดํ†ต 1์”ฉ ์ฆ๊ฐ€)์œผ๋กœ ๋‹ค์Œ ์Šฌ๋กฏ์„ ํ™•์ธํ•œ๋‹ค.

์žฅ์  : ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ํ•„์š” ์—†๋‹ค.

๋‹จ์  : ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ(๋งŽ์€ ์ถฉ๋Œ์ด ์ธ์ ‘ํ•œ ์Šฌ๋กฏ์— ๋ชฐ๋ฆฌ๋Š” ๊ฒƒ) <- ๊ตฐ์ง‘ํ™”

 

2-2) ์ด์ฐจ ํƒ์‚ฌ (Quadratic Probing)

์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ด์ฐจํ•จ์ˆ˜๊ผด (ex) 1, 4, 9, 16 ... ํ˜•ํƒœ๋กœ ์Šฌ๋กฏ์„ ํ™•์ธํ•œ๋‹ค.

์žฅ์  : ๊ตฐ์ง‘ํ™”๋ฅผ ์ค„์—ฌ์ค€๋‹ค. 

๋‹จ์  : ์ด์ฐจ ํ•จ์ˆ˜์— ๋”ฐ๋ผ ํŠน์ • ํŒจํ„ด์œผ๋กœ ์ด์ฐจ ๊ตฐ์ง‘ํ™”๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. 

2-3) ์ด์ค‘ ํ•ด์‹ฑ (Double Hashing)

์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋‘ ๋ฒˆ์งธ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

์ด์ค‘ํ•ด์‹ฑ์‹œ ๋‘ ๊ฐ€์ง€์˜ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ๋‹ฌ๋ผ์•ผ ํ‚ค๋ฅผ ๋” ์ž˜ ๋ถ„๋ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ํ•ด์‹ฑํ•จ์ˆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)์ด์—ฌ์•ผ ์„ฑ๋Šฅ์ด ์ข‹์œผ๋ฉฐ ๋‘ ๋ฒˆ์งธ ํ•ด์‹œํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ€ 0์ด ๋˜๋ฉด ์ฒซ ๋ฒˆ์งธ ํ•ด์‹œํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์™€ ๊ฐ™์•„์ง€๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ 0์ด๋ฉด ์•ˆ๋œ๋‹ค. 

์žฅ์  : ๊ตฐ์ง‘ํ™”๋ฅผ ์ค„์—ฌ์ค€๋‹ค.

๋‹จ์  : ๋‘ ๊ฐœ์˜ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

์ถฉ๋Œ ์ฒ˜๋ฆฌ๋Š” ํ•ด์‹œ๋งต์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

์ฒด์ด๋‹์€ ์™ธ๋ถ€ ์ €์žฅ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ณ , ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ์€ ํ•ด์‹œ ํ…Œ์ด๋ธ” ์ž์ฒด์—์„œ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ๋‹ค. 

๊ฐ ๋ฐฉ๋ฒ•์—๋Š” ์œ„์— ์„œ์ˆ ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ์žฅ ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ, ํŠน์ • ์ƒํ™ฉ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค. 

 

 

โœ๏ธ HashMap์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ

  • put(K key, V value): ์ฃผ์–ด์ง„ ํ‚ค์™€ ๊ฐ’ ์Œ์„ HashMap์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ‚ค๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ํ•ด๋‹น ํ‚ค์˜ ๊ฐ’์„ ์ƒˆ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
  • get(Object key): ์ฃผ์–ด์ง„ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ ํ‚ค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • remove(Object key): ์ฃผ์–ด์ง„ ํ‚ค์™€ ๊ทธ์— ๋Œ€์‘ํ•˜๋Š” ๊ฐ’์„ HashMap์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
  • containsKey(Object key): ์ฃผ์–ด์ง„ ํ‚ค๊ฐ€ HashMap์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • containsValue(Object value): ์ฃผ์–ด์ง„ ๊ฐ’์ด HashMap์— ํ•˜๋‚˜ ์ด์ƒ ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • size(): HashMap์— ์ €์žฅ๋œ ํ‚ค-๊ฐ’ ์Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

โœ๏ธ์„ฑ๋Šฅ ํŠน์„ฑ

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: HashMap์€ ํ‰๊ท ์ ์œผ๋กœ O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ํ‚ค-๊ฐ’ ์Œ์„ ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ์•…์˜ ๊ฒฝ์šฐ(๋ชจ๋“  ํ‚ค๊ฐ€ ๊ฐ™์€ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์งˆ ๋•Œ)์—๋Š” O(n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • ๊ณต๊ฐ„ ๋ณต์žก๋„: HashMap์€ ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ์ด ๋งŽ์„์ˆ˜๋ก ๋” ๋งŽ์€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

โœ๏ธ Hash Map ๊ณผ Hash Table์˜ ๋น„๊ต

๊ณตํ†ต์ 

  • ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ: ๋‘˜ ๋‹ค ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ํ•ด์‹œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. 
  • ํ‚ค-๊ฐ’ ์Œ: ๋‘˜ ๋‹ค ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ํ‚ค๋Š” ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค.

์ฐจ์ด์ 

1. ๋™๊ธฐํ™” (Synchronization)

  • Hashtable: ๋™๊ธฐํ™”๋œ(synchronized) ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ Hashtable์— ์ ‘๊ทผํ•˜๋”๋ผ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
  • HashMap: ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์ง€์•Š๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์™ธ๋ถ€์—์„œ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

2. ์„ฑ๋Šฅ (Performance)

  • Hashtable: ๋™๊ธฐํ™” ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์„ ์ˆ˜ ์žˆ๋‹ค.
  • HashMap: ๋™๊ธฐํ™”๊ฐ€ ์—†์–ด์„œ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ Hashtable๋ณด๋‹ค ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

3. Null ํ‚ค์™€ ๊ฐ’ (Null Keys and Values)

  • Hashtable: ํ‚ค์™€ ๊ฐ’ ๋ชจ๋‘ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • HashMap: ํ•˜๋‚˜์˜ null ํ‚ค์™€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ null ๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค.

4. ์ดˆ๊ธฐ ์šฉ๋Ÿ‰๊ณผ ํ™•์žฅ (Initial Capacity and Load Factor)

  • Hashtable: ๊ธฐ๋ณธ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์€ 11์ด๊ณ , ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ๋•Œ ๋‘ ๋ฐฐ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ธฐ๋ณธ ๋กœ๋“œ ํŒฉํ„ฐ(load factor)๋Š” 0.75์ด๋‹ค.
  • HashMap: ๊ธฐ๋ณธ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์€ 16์ด๊ณ , ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ๋•Œ ๋‘ ๋ฐฐ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค. ๊ธฐ๋ณธ ๋กœ๋“œ ํŒฉํ„ฐ๋Š” 0.75๋กœ, ๋กœ๋“œ ํŒฉํ„ฐ๋ฅผ ํ†ตํ•ด ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๋ฐ€๋„๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

5. ์ƒ์† ๊ณ„์ธต ๊ตฌ์กฐ (Inheritance Hierarchy)

  • Hashtable: Hashtable ํด๋ž˜์Šค๋Š” Dictionary ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ์œผ๋ฉฐ, Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋Š” Legacy ํด๋ž˜์Šค์ด๋‹ค.
  • HashMap: HashMap ํด๋ž˜์Šค๋Š” AbstractMap ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋Š” ๋” ํ˜„๋Œ€์ ์ธ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ผ๋ถ€์ด๋‹ค.

๊ฒฐ๋ก : 

  • HashMap์€ ๋” ์œ ์—ฐํ•˜๊ณ , ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•˜๋ฉฐ, ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ ํ•ฉํ•˜๋‹ค.
  • Hashtable์€ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ ๋ณด์žฅํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ณ  ํ˜„๋Œ€์ ์ธ ์‚ฌ์šฉ์—๋Š” ๋œ ์ ํ•ฉํ•˜๋‹ค.

(๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” HashMap์„ ์‚ฌ์šฉํ•  ๋•Œ ์™ธ๋ถ€์—์„œ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ConcurrentHashMap๊ณผ ๊ฐ™์€ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•œ ๋Œ€์•ˆ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค)

 

 

โœ๏ธ  ๊ด€๋ จ ๋ฌธ์ œ ํ’€์ด

1) ๋ฐฑ์ค€ 26008๋ฒˆ : ํ•ด์‹œํ•ดํ‚น (๋ณต์Šต)

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํ•ด์‹œํ•จ์ˆ˜์˜ ์ด๋ก ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ง€๋งŒ ํ’€์ด๋ฒ•์€ ๊ทธ๋ƒฅ ์ˆ˜ํ•™์ ์œผ๋กœ ๋‹ค๊ฐ€๊ฐ€์•ผ ์‹œ๊ฐ„์„ ๋„˜๊ธฐ์ง€ ์•Š๊ณ  ํ’€ ์ˆ˜ ์žˆ๋‹ค.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int a = Integer.parseInt(st.nextToken());
        int h = Integer.parseInt(br.readLine());

        long result = 1;
        for(int i=0; i<n-1; i++){
            result = (result * m) % 1000000007;
        }

        System.out.println(result % 1000000007);
    }
}

ํ’€์ด :

(h(p) = H)์ผ ๊ฒฝ์šฐ์˜ ์ˆ˜ = M (์™œ๋ƒํ•˜๋ฉด 0 <= h(p) <= M-1 ์ด๋ฏ€๋กœ)

๋˜ํ•œ  ๋ฐฐ์—ด P์˜ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ธธ์ด๊ฐ€ N์ธ p๋“ค์ด ๊ฐ๊ฐ 0~M-1 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ€์ง€๋ฏ€๋กœ M^N ๊ฐœ๋ฅผ ๊ฐ€์ง„๋‹ค.

๋”ฐ๋ผ์„œ h(p)๊ฐ€ ๊ตฌํ•œ ํ•ด์‹ฑ๊ฐ’ H์ผ ๊ฒฝ์šฐ์˜ ์ˆ˜ = ๋ฐฐ์—ด P๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ * h(p)์˜ ๊ฐ’์ด H์ผ ํ™•๋ฅ  ์ด๋ฏ€๋กœ

๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’ = M^(N) * (1/M) = M^(N-1) ์ด๋‹ค.

๋ฌธ์ œ์—์„œ๋Š” ๊ฐ’์ด ๋„ˆ๋ฌด ์ปค์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์œผ๋กœ % 1000000007์„ ํ•ด๊ฐ€๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

 

2. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค : ํ•ด์‹œ_์˜์ƒ

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;

		// Map์— key๊ฐ’์„ ์˜์ƒ์˜ ์ข…๋ฅ˜๋กœ ๋‘๊ณ  key๊ฐ’์ด ์ค‘๋ณต๋˜๋Š” ๋งŒํผ value์— count++
        Map<String, Integer> clothesMap = new HashMap<>();
        for(int i=0; i<clothes.length; i++){
            if(clothesMap.containsKey(clothes[i][1])){
                int temp = clothesMap.remove(clothes[i][1]) + 1;
                clothesMap.put(clothes[i][1], temp);
            }else{
                clothesMap.put(clothes[i][1], 1);
            }
        }

		// count๋ฅผ ๋ชจ์•„๋‘” values๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
        Collection<Integer> values = clothesMap.values();

		// ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ฐ ์˜์ƒ๋ณ„๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜์ƒ์ˆ˜๊ฐ€ x์ผ๋•Œ (x+1)C1 <- ์กฐํ•ฉ ์„ ๋ชจ๋‘ ๊ณฑํ•œ ๋’ค ์•„์˜ˆ ์•ˆ์ž…์€ ๊ฒฝ์šฐ 1์„ ๋นผ๋Š” ๊ฒƒ์ด๋‹ค. 
        for(Integer val : values){
            answer *= (val + 1);
        }
        answer--;
        return answer;
    }
}

* ํ’€์ด๋Š” ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ’€์—ˆ์ง€๋งŒ, ๋” ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด์•˜๋Š”๋ฐ, Stream์„ ์ด์šฉํ•ด์„œ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์„ ๋” ๊ณต๋ถ€ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค!!

๋‚ด๊ฐ€ ํ‘ผ ํ’€์ด๋ž‘ ๋น„์Šทํ•˜๊ฒŒ๋Š” Collection์„ iterator๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š”๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ •๋„?