๐ 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์ ์ ํํ๋๊ฐโ
๋ฅผ ์ค๋ช ํ ์ ์๋ ์์ค๊น์ง ๊ฐ๋ ๊ฒ์ด๋ค.