
Problem ๐ป
https://school.programmers.co.kr/learn/courses/30/lessons/120903
๋ฌธ์ ์ค๋ช
๋ ๋ฐฐ์ด์ด ์ผ๋ง๋ ์ ์ฌํ์ง ํ์ธํด๋ณด๋ ค๊ณ ํฉ๋๋ค. ๋ฌธ์์ด ๋ฐฐ์ด s1๊ณผ s2๊ฐ ์ฃผ์ด์ง ๋ ๊ฐ์ ์์์ ๊ฐ์๋ฅผ returnํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- 1 ≤ s1, s2์ ๊ธธ์ด ≤ 100
- 1 ≤ s1, s2์ ์์์ ๊ธธ์ด ≤ 10
- s1๊ณผ s2์ ์์๋ ์ํ๋ฒณ ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค
- s1๊ณผ s2๋ ๊ฐ๊ฐ ์ค๋ณต๋ ์์๋ฅผ ๊ฐ์ง ์์ต๋๋ค.
์ ์ถ๋ ฅ ์: s1s2
| ["a", "b", "c"] | ["com", "b", "d", "p", "c"] | 2 |
| ["n", "omg"] | ["m", "dot"] | 0 |
Approach 1 โ - ๋์ ์ด๊ธฐ ์ ๊ทผ๋ฒ
1. ๊ฐ ๋ฐฐ์ด์ ์์๋ค์ ํ๋์ฉ ๊ฒํ ํด์ผ ํ๋ค. - for๋ฌธ์ ์ด์ฉํด์ ์ธ๋ฑ์ค0๋ถํฐ ์ฐจ๋ก๋๋ก ์์๋ฅผ ๊บผ๋ด์ ์ถ๋ ฅ์ํจ๋ค.
2. ์ธ๋ฑ์ค ์์์ ์๊ด์์ด ์๋ ๋ฐฐ์ด์ ์์์ ๋น๊ต๋ฅผ ์์ผ์ผ ํ๋ค. ๊ฐ์์ง ์ฐพ๋ ๋ฌธ๋ฒ์ ๋ชจ๋ฅธ๋ค.
3. ๊ฐ์ ์์์ ๊ฐ์๋ฅผ ์ธ์ผ ํ๋ค. - ์์๋ฅผ ์ธ๋ ๋ฌธ๋ฒ์ด ๋ ์ค๋ฅด์ง ์๋๋ค
Approach 2 โญ - ๋์ ์ ๊ทผ๋ฒ์ ๋ํ ๊ต์
1. ๋ฌธ์ ์ดํด
- ๋ฌธ์์ด ๋ฐฐ์ด s1๊ณผ s2๊ฐ ์ฃผ์ด์ง๋ค.
- ๋ ๋ฐฐ์ด์ ๊ณตํต์ผ๋ก ์กด์ฌํ๋ ๋ฌธ์์ด์ ๊ฐ์๋ฅผ ์ฐพ์์ผ ํ๋ค.
1. ๋ฐฐ์ด์ ์์๋ฅผ ํ๋์ฉ ๊ฒํ ํด์ผ ํ๋ค.
for ๋ฌธ์ ์ด์ฉํด ๋ฐฐ์ด์ ์ธ๋ฑ์ค 0๋ถํฐ ๋๊น์ง ๋ฐ๋ณตํ๋ฉฐ ๋ชจ๋ ์์๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ์ฌ์ฉํ ๊ฒ์ ์๊ฐํ์๋ค.
์ด๋ ๊ธฐ๋ณธ์ ์ธ ์ ๊ทผ๋ฒ์ด๋ค. ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ํ์ํ ๊ณผ์ ์ด๋ค.
2. ์ธ๋ฑ์ค ์์์ ์๊ด์์ด ์๋ ๋ฐฐ์ด์ ์์์ ๋น๊ตํ๋ค.
๋ฐฐ์ด ๊ฐ์ ๋น๊ต๋ฅผ ์ํด ์ธ๋ฑ์ค ์์๋ฅผ ๋ฌด์ํ๊ณ ์์๋ง ๋น๊ตํด์ผ ํ๋ค๋ ์ ์ ์ ํํ ์ดํดํ์๋ค.
ํ์ง๋ง ๋ฐฐ์ด์๋ contains() ๊ฐ์ ํธ๋ฆฌํ ๋ฉ์๋๊ฐ ์๋ค๋๊ฑธ ๋ชฐ๋๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ์๊ฐํ๊ฑฐ๋ค.
3. ๊ฐ์ ์์์ ๊ฐ์๋ฅผ ์ธ์ผ ํ๋ค.
๊ณตํต ์์๋ฅผ ์ฐพ๊ณ ์ด๋ฅผ ์นด์ดํธํด์ผ ํ๋ค๋ ๋ชฉํ๋ฅผ ๋ช ํํ ์ค์ ํ๋ค.
“์์๋ฅผ ์ธ๋ ๋ฌธ๋ฒ”์ด ๋ ์ค๋ฅด์ง ์๋๋ค๋ ์ ์์ ํ์ํ ๋๊ตฌ๋ ๋ฉ์๋์ ๋ํ ์ง์์ด ๋ถ์กฑํ์์ ์ธ์งํ๋ค.
-----
ํ๊ฐ
1. ๋ ผ๋ฆฌ์ ํ๋ฆ: ๋ฌธ์ ๋ฅผ ์ดํดํ๊ณ ๋๋ฆ์ ํด๊ฒฐ ์ ๋ต์ ์ธ์ฐ๋ ๊ณผ์ ์ ๋ ผ๋ฆฌ์ ์ด์๋ค
๋ชจ๋ ์์๋ฅผ ์ํํ๊ณ , ๊ณตํต ์์๋ฅผ ํ์ธํ๋ฉฐ, ์ด๋ฅผ ์นด์ดํธํ๋ ๋จ๊ณ์ ์ ๊ทผ์ ์ณ์๋ค.
๋ฐฐ์ด์ ํ๊ณ๋ฅผ ์ดํดํ๊ณ ํ์ํ ๋ฉ์๋๊ฐ ์๋ค๋ ์ ์ ์ธ์ํ ๊ฒ๋ ๊ด์ฐฎ์๋ค.
2. ํ๊ณ: ๋ฐฐ์ด์ ๊ธฐ๋ณธ์ ์ธ ํ๊ณ๋ฅผ ๋์ด์ ํจ์จ์ ์ธ ํด๊ฒฐ ๋ฐฉ์์ ์ฐพ๋ ๋ฐ ์์ด ์ด๋ ค์์ ๊ฒช๊ณ ์์๋ค.
• ๋ฐฐ์ด์ Set์ผ๋ก ๋ณํํ๊ฑฐ๋, contains()๋ฅผ ์ง์ ๊ตฌํํ๋ ๋ฑ์ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ์ง ๋ชปํ๋ค.
----
๊ฐ์ ํ ์ ๊ณผ ๋ฐฉ๋ฒ
1. ํจ์จ์ฑ์ ๋ํ ๊ณ ๋ ค
• ๋ฐฐ์ด๋ก ์ง์ ๋น๊ตํ๋ฉด ๊ฐ ์์๋ง๋ค ๋ค๋ฅธ ๋ฐฐ์ด์ ๋ฐ๋ณต ๋น๊ตํด์ผ ํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๊ฐ O(n * m)์ด๋ค.
• ์ด๋ฅผ ๊ฐ์ ํ๋ ค๋ฉด ๋ฐฐ์ด์ Set์ผ๋ก ๋ณํํด์ผ ํ๋ค. Set์ ์์์ ํฌํจ ์ฌ๋ถ๋ฅผ ํ๊ท O(1)์ ์๊ฐ ๋ณต์ก๋๋ก ํ์ธํ ์ ์๋ค.
• ๊ฐ์ ๋ฐฉ๋ฒ:
2. ๋ชจ๋ฅด๋ ๋ฌธ๋ฒ๊ณผ ๋ฉ์๋ ํ๊ตฌSet<String> set = new HashSet<>(Arrays.asList(s2));โ
• ๋ฐฐ์ด๊ณผ ๊ด๋ จ๋ ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฉ์๋(Arrays, Set, HashSet)๋ฅผ ํ์ตํ๋ฉด ๋ฌธ์ ํด๊ฒฐ์ ํ์ํ ๋๊ตฌ๋ฅผ ๋ ์ ํ์ฉํ ์ ์๋ค.
• ์ถ์ฒ ํ์ต ํญ๋ชฉ:
- Arrays.asList()๋ฅผ ์ด์ฉํ ๋ฐฐ์ด์ ๋ฆฌ์คํธ๋ก ๋ณํ
- HashSet๊ณผ ๊ฐ์ ์ปฌ๋ ์ ํ์ฉ๋ฒ
- Set.contains() ๋ฉ์๋ ์ฌ์ฉ๋ฒ
3. ๋ ผ๋ฆฌ ๋จ์ํ
• ๋ฐฐ์ด์ ๋จ์ํ for ๋ฌธ์ผ๋ก ์ํํ๊ณ ๋ ๋ค๋ฅธ for ๋ฌธ์ ๋๋ ค ๋น๊ตํ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์๋ค.
• Set์ ํ์ฉํ๋ฉด ๊ณตํต ์์ ํ์์ด ๊ฐ๊ฒฐํด์ง๋ค.
• ๊ฐ์ ๋ ์ฝ๋:
Set<String> set = new HashSet<>(Arrays.asList(s2)); long count = Arrays.stream(s1).filter(set::contains).count();โ
2. ํ์ด ๋ ผ๋ฆฌ
2.1 ๋ฐฐ์ด ์ํ : ๋ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ๊ฒํ ํ๊ธฐ. ์๋ฅผ ๋ค์ด, ๋ฐฐ์ด s1์ ๊ฐ ์์๋ฅผ ๊บผ๋ด๋ฉด์ s2์ ์์๋ค๊ณผ ๋น๊ตํ๋ค.
2.2 ํจ์จ์ ์ธ ๋น๊ต : ๋ฐฐ์ด์ ์ํํ๋ฉฐ ์์๋ฅผ ๋น๊ตํ ๋, ๋ฐฐ์ด๋ณด๋ค Set ์๋ฃ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ฉด ๋ ํจ์จ์ ์ผ๋ก ์์์ ํฌํจ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
2.3 ๊ณตํต ์์ ์นด์ดํธ : ๊ณตํต ์์๋ฅผ ํ์ธํ ๋๋ง๋ค ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
Solution ๐ก
import java.util.HashSet;
import java.util.Set;
public class CommonElements {
public static int solution(String[] s1, String[] s2) {
//s2๋ฅผ Set์ผ๋ก ๋ณํ (๋น ๋ฅธ ํฌํจ ์ฌ๋ถ ํ์ธ)
Set<String> set = new HashSet<>();
for (String elelment : s2) {
set.add(element);
}
// s1์ ๊ฐ ์์๊ฐ s2(Set)์ ํฌํจ๋์ด ์๋์ง ํ์ธ
int count = 0;
for (String element : s1) {
if (set.contains(element)) {
count++;
}
}
return count;
}
public static void main(String[] args) {
// ํ
์คํธ ์์
String[] s1 = {"a", "b", "c"};
String[] s2 = {"com", "b", "d", "p", "c"};
System.out.println(solution(s1, s2)); // ์ถ๋ ฅ: 2
}
}
๋จ๊ณ๋ณ ๋ ผ๋ฆฌ์ ์ฌ๊ณ ๊ณผ์
1. ๋ฌธ์ ๋ถํด
- ๋ฐฐ์ด์ ๋น๊ตํ๊ณ ๊ณตํต ์์๋ฅผ ํ์ธํ ๋ค, ์นด์ด๋ํด์ผ ํ๋ค๋ ๋ฌธ์ ๋ฅผ ์ธ๋จ๊ณ๋ก ๋๋๋ค:
1. ๋ฐฐ์ด ์ํ
2. ๊ณตํต ์์ ํ์ธ
3. ์นด์ดํธ
2. ํจ์จ์ฑ ๊ณ ๋ ค
- ๋ฐ๋ณต๋ฌธ๋ง ์ฌ์ฉํ๋ ๋์ , ํจ์จ์ ์ธ ์๋ฃ๊ตฌ์กฐ์ธ Set์ ํ์ฉํ๋ค.
3. ๊ตฌํ ๋จ๊ณ
- ์์ ๊ธฐ๋ฅ๋ถํฐ ํ๋์ฉ ์ถ๊ฐํ๋ค.
1. Set์ผ๋ก ๋ณํ.
2. contains()๋ก ๊ณตํต ์์ ํ์ธ.
3. ์นด์ดํธ ์ฆ๊ฐ.
1. Set์ผ๋ก ๋ณํ
Set<String> set = new HashSet<>();
for (String element : s2) {
set.add(element);
}
- ๋ฐฐ์ด s2๋ฅผ HashSet์ผ๋ก ๋ณํํ๋ค.
- Set์ ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ , ํฌํจ ์ฌ๋ถ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
2. ํฌํจ ์ฌ๋ถ ํ์ธ
for (String element : s1) {
if (set.contains(element)) {
count++;
}
}
- s1์ ๊ฐ ์์๋ฅผ set.contains()๋ก ํ์ธํ๋ค.
- ๊ณตํต ์์๊ฐ ์์ผ๋ฉด count๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
3. ์๊ฐ ๋ณต์ก๋
• s2๋ฅผ Set์ผ๋ก ๋ณํํ๋ ๋ฐ O(m)
• s1์ ์ํํ๋ฉฐ ํฌํจ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฐ O(n)
• ์ ์ฒด ์๊ฐ ๋ณต์ก๋: O(n + m)
Reference ๐
HashSet๊ณผ HashMap
1 . HashSet์ด๋?
HashSet์ ์ค๋ณต์ ํ์ฉํ์ง ์๋ ์งํฉ(Set)์ด๋ค.
๋ด๋ถ์ ์ผ๋ก HashMap์ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ์ง๋ง, ํค(key)๋ง ์ฌ์ฉํ๊ณ ๊ฐ(value)์ ์๋ค.
์ฝ๊ฒ ๋งํด, HashSet์ "๋ฐ์ดํฐ์ ์กด์ฌ ์ฌ๋ถ๋ง ํ์ธํ๋ "๋ฐ ์ต์ ํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
2. HashSet์ ํน์ง
2.1 ์ค๋ณต ํ์ฉ ์ ํจ
- ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฒ ๋ฃ์ผ๋ฉด ํ๋๋ง ์ ์ฅ๋๋ค.
Set<String> set = new HashSet<>();
set.add("a");
set.add("a");
System.out.println(set.size()); //์ถ๋ ฅ: 1 (์ค๋ณต ์ ๊ฑฐ๋จ)
set.size()๋ HashSet์ด๋ ๋ค๋ฅธ Set ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ฃ๊ตฌ์กฐ์์ ์ฌ์ฉ๋๋ ๋ฉ์๋๋ก, Set์ ์ ์ฅ๋ ์์์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
• size()๋ O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฏ๋ก ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ํ๋ค.
2.2 ์์๊ฐ ์์
- ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.
set.add("b");
set.add("c");
System.out.println(set); // ์ถ๋ ฅ: [a, c, b] (์์ ๋ณด์ฅ ์ ๋จ)
2.3. ํฌํจ ์ฌ๋ถ ํ์ธ
set.contains(element) ๋ฉ์๋๋ฅผ ํตํด ํน์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์๋ค.
๋ด๋ถ์ ์ผ๋ก๋ ํด์ฑ(hash)์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค.
3. HashSet๊ณผ HashMap์ ์ฐจ์ด

์์๋ก ์ฐจ์ด ์ดํดํ๊ธฐ
HashSet
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
System.out.println(set.contains("apple")); //true
System.out.println(set.contains("orange")); //false
๋ฐ์ดํฐ๊ฐ "์กด์ฌํ๋์ง"๋ง ํ์ธ ๊ฐ๋ฅํ๋ค.
HashMap
Map<String, String> map = new HashMap<>();
map.put("apple", "fruit");
map.put"carrot", "vegetable");
System.out.println(map.get("apple")); // fruit
System.out.println(map.containsKey("carrot")); // true
Key์ Value์ ์ง์ ์ ์ฅํ๋ค. - HashMap์ด Key์ Value๋ฅผ ์ ์ฅํ๋ ์๋ฆฌ๋ ๋ฐ์ ...
4. HashSet์์ contains()๊ฐ ์๋ํ๋ ๋ฐฉ์
set.contains(element) ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฆฌ๋ก ์๋ํ๋ค:
1. ํด์ฑ(Hashing)
• HashSet ๋ด๋ถ์์ ์ ์ฅ๋ ์์๋ ํด์๊ฐ(๊ณ ์ ์ซ์ ๊ฐ)์ผ๋ก ๊ด๋ฆฌ๋๋ค.
• ํน์ ์์๋ฅผ ์ฐพ์ ๋๋ ๋์ผํ ํด์๊ฐ์ ๊ณ์ฐํ์ฌ ์ ์ฅ๋ ํด์๊ฐ๊ณผ ๋น๊ตํ๋ค.
• ํด์ฑ ๋๋ถ์ ํฌํจ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค.
2. ์๊ฐ ๋ณต์ก๋
set.contains(element)์ ํ๊ท ์๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ค.
์ด๋ ํด์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ฆ์ ํ์ธํ๊ธฐ ๋๋ฌธ์ด๋ค.
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
// "b"๊ฐ ์๋์ง ํ์ธ
if (set.contains("b")) {
System.out.println("b๋ HashSet์ ํฌํจ๋์ด ์์ต๋๋ค.");
} else {
System.out.println("b๋ HashSet์ ํฌํจ๋์ด ์์ง ์์ต๋๋ค.");
}
5.. HashSet์ ์ฌ์ฉํ๋ ์ด์
• ๋น ๋ฅธ ๊ฒ์ ์๋: ํฌํจ ์ฌ๋ถ ํ์ธ์ด ๋น ๋ฅด๋ฉฐ, ๋ฐ๋ณต๋ฌธ์์ ์ฌ์ฉํ๊ธฐ ์ ํฉํ๋ค.
• ์ค๋ณต ์ ๊ฑฐ: ์ค๋ณต๋ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํ๋ค.
• ์ด ๋ฌธ์ ์์๋ HashSet์ ์ฌ์ฉํด s2 ๋ฐฐ์ด์ ๋ณํํ ํ, s1์ ์์์ ๋น๊ตํ๋ ๋ฐฉ์์ผ๋ก ๊ณตํต ์์๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์๋ค.
HashSet์ด ์ ํ์ํ๊ฐ?
1. ํจ์จ์ : ๋ฐฐ์ด๋ก ์ง์ ๋น๊ตํ๋ ค๋ฉด ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ธํด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
2. ๊ฐ๋จํ ์ฝ๋: contains() ๋ฉ์๋๋ก ํฌํจ ์ฌ๋ถ๋ฅผ ์ฝ๊ฒ ํ์ธํ ์ ์๋ค.
3. ์ค๋ณต ์ ๊ฑฐ: ์๋์ผ๋ก ์ค๋ณต์ ์ ๊ฑฐํด ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ์ ์งํ ์ ์๋ค.
ํด์ฑ(Hashing)์ด๋?
ํด์ฑ์ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ํ ์ซ์ ๊ฐ(ํด์๊ฐ)์ผ๋ก ๋ณํํ๋ ๊ธฐ์ ์ด๋ค.
์ด ๊ณ ์ ํ ์ซ์ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์, ์ฝ์ , ์ญ์ ํ ์ ์๋๋ก ํ๋ค.
ํด์ฑ์ ์ฃผ๋ก HashMap, HashSet, HashTable๊ณผ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ์์ ์ฌ์ฉ๋๋ฉฐ, ๋ฐ์ดํฐ ๊ฒ์์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํ ํต์ฌ ๊ธฐ์ ์ด๋ค.
ํด์ฑ์ ์๋ฆฌ
1. ์ ๋ ฅ ๋ฐ์ดํฐ → ํด์ ํจ์ → ํด์
๋ฐ์ดํฐ๋ฅผ ํด์ ํจ์(Hash Function)์ ์ ๋ ฅํ๋ฉด ๊ณ ์ ํ ํด์๊ฐ(Hash Value)์ด ์์ฑ๋๋ค.
์: "apple" → hash("apple") → 42
2. ํด์๊ฐ์ ์ฌ์ฉํด ์ ์ฅ ์์น ๊ฒฐ์
ํด์๊ฐ์ ๋ณดํต ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉ๋๊ฑฐ๋ ๋ฐ์ดํฐ์ ์ ์ฅ ์์น๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ค
์: "apple"์ ํด์๊ฐ 42๋ฅผ ์ป๊ณ , ๋ฐฐ์ด์ 42๋ฒ ์์น์ ์ ์ฅ๋๋ค.
3. ๊ฒ์ ์์๋ ํด์ ํจ์ ํ์ฉ
ํน์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๋๋ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๋ก ์ฐพ์๋ธ๋ค.
์: "apple"์ ๊ฒ์ํ๋ฉด hash("apple") → 42๋ก ๊ณ์ฐํ๊ณ , 42๋ฒ ์์น๋ฅผ ํ์ธํ๋ค.
ํด์ฑ์ด ์ค์ํ ์ด์
ํด์ฑ์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ํจ์จ์ ์ด๋ค:
1. ๋น ๋ฅธ ๋ฐ์ดํฐ ๊ฒ์
• ์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ค๋ฉด ์์๋ฅผ ํ๋์ฉ ํ์ธํด์ผ ํ๋ฏ๋ก O(n)์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
๋ฐ๋ฉด ํด์ฑ์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ์ ์์น๋ฅผ ํด์๊ฐ์ผ๋ก ๊ณ์ฐํด ๋ฐ๋ก ์ ๊ทผํ๋ฏ๋ก, ํ๊ท O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
2. ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ
• ๋ฐ์ดํฐ๊ฐ ๊ณ ์ ํ ์์น(ํด์๊ฐ)๋ก ์ ์ฅ๋๋ฏ๋ก, ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๊ณ ์ ํ ๋ฐ์ดํฐ๋ง ์ ์งํ๊ธฐ ์ฌ์์ง๋ค.
ํด์ ํจ์๋?
ํด์ ํจ์(Hash Function)๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ํน์ ๊ท์น์ ๋ฐ๋ผ ๊ณ ์ ํ ์ซ์(ํด์๊ฐ)๋ก ๋ณํํ๋ ํจ์์ด๋ค.
์ข์ ํด์ ํจ์์ ์กฐ๊ฑด:
1. ๋น ๋ฅธ ๊ณ์ฐ: ์ ๋ ฅ ๋ฐ์ดํฐ์์ ํด์๊ฐ์ ๋น ๋ฅด๊ฒ ๊ณ์ฐํ ์ ์์ด์ผ ํ๋ค.
2. ๊ณ ์ ์ฑ: ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ ๋ค๋ฅธ ํด์๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค.
3. ๊ท ๋ฑ ๋ถํฌ: ํด์๊ฐ์ด ๊ฐ๋ฅํ ํ ๊ณ ๋ฅด๊ฒ ๋ถํฌ๋์ด์ผ ํ๋ค. (ํ ์์น์ ๋ฐ์ดํฐ๊ฐ ๋ชฐ๋ฆฌ์ง ์๋๋ก)
ํด์ฑ์ ๋ฌธ์ ์ : ์ถฉ๋(Hash Collision)
์ถฉ๋์ด๋ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ ํด์๊ฐ์ ๊ฐ์ง๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
์:
• "apple" → ํด์๊ฐ 42
• "banana" → ํด์๊ฐ 42
์ถฉ๋์ ํด์ ํจ์๊ฐ ์๋ฒฝํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๋ค.
์ถฉ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ
1. ์ฒด์ด๋(Chaining)
๋์ผํ ํด์๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ด๋ฆฌํ๋ค.
์: ๋ฐฐ์ด์ 42๋ฒ ์์น์ "apple"๊ณผ "banana"๊ฐ ๋ชจ๋ ์ ์ฅ๋์ง๋ง, ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ด์ด ๋ถ์ธ๋ค.
2. ์คํ ์ด๋๋ ์ฑ(Open Addressing)
์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋ค์ ๋น ๊ณต๊ฐ(๋ฐฐ์ด์ ๋ค๋ฅธ ์์น)์ ์ฐพ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
์: 42๋ฒ์ด ์ถฉ๋๋๋ฉด 43๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
HashSet์์ ํด์ฑ์ ์ญํ
• HashSet์ ํด์ฑ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ค.
• ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ฒ์ํ ๋, ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๊ณ์ฐํ๊ณ ํฌํจ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
• ์: set.contains("apple")๋ "apple"์ ํด์๊ฐ์ ๊ณ์ฐํ๊ณ , ํด๋น ์์น์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธํ๋ค.
ํด์ฑ์ ์ฌ์ฉ ์์
1. HashSet
Set<String> set = new HashSet<>();
set.add("apple"); // "apple"์ ํด์๊ฐ์ ๊ณ์ฐํ์ฌ ์ ์ฅ
set.add("banana");
System.out.println(set.contains("apple")); // ํด์๊ฐ์ ๊ณ์ฐํ์ฌ ์กด์ฌ ์ฌ๋ถ ํ์ธ
2. HashMap
Map<String, Integer> map = new HashMap<>();
map.put("apple", 5); // "apple"์ ํด์๊ฐ์ ๊ณ์ฐํด ์ ์ฅ
map.put("banana", 3);
System.out.println(map.get("apple")); // ํด์๊ฐ์ ๊ณ์ฐํ์ฌ "apple"์ ๊ฐ(5)์ ๋ฐํ
์ ๋ฆฌ
1. ํด์ฑ์ ์ ์
• ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ํ ์ซ์(ํด์๊ฐ)๋ก ๋ณํํ์ฌ ๋น ๋ฅด๊ฒ ์ ์ฅ/๊ฒ์ํ ์ ์๊ฒ ํ๋ ๊ธฐ์ .
2. HashSet๊ณผ ํด์ฑ
• ๋ฐ์ดํฐ์ ์ค๋ณต ์ ๊ฑฐ์ ํฌํจ ์ฌ๋ถ ํ์ธ์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
• set.contains()๋ ํด์ฑ์ ์ฌ์ฉํด ํ๊ท O(1)๋ก ๋์ํ๋ค.
3. HashMap๊ณผ ํด์ฑ
• ๋ฐ์ดํฐ๋ฅผ ํค-๊ฐ ์์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ํด์๊ฐ์ ์ฌ์ฉํด ํค์ ์์น๋ฅผ ๊ณ์ฐํ๋ค.
4. ํด์ฑ์ ์ด์
• ๋น ๋ฅธ ๋ฐ์ดํฐ ์ ๊ทผ(O(1) ๋ณต์ก๋)
• ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ฒ์
HashMap์์ Key์ Value๊ฐ ์ด๋ป๊ฒ ์ง์ ์ด๋ฃจ์ด ์ ์ฅ๋๊ณ , ์ด๋ฅผ ์ด๋ป๊ฒ ๊ฒ์ํ๋์ง.
HashMap์ ํด์ฑ(Hashing) ๊ธฐ์ ์ ์ฌ์ฉํด Key๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Value๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
Key๋ ๊ณ ์ ํ ์๋ณ์ ์ญํ ์ ํ๊ณ , Value๋ Key์ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ์ด๋ค.
HashMap์ ๋์ ๊ณผ์
1. Key์ ํด์๊ฐ ๊ณ์ฐ
• map.put(Key, Value)๋ฅผ ํธ์ถํ๋ฉด, HashMap์ ๋จผ์ Key์ ๋ํด ํด์ ํจ์(Hash Function)๋ฅผ ํธ์ถํ์ฌ ํด์๊ฐ(Hash Code)์ ๊ณ์ฐํ๋ค.
• ์๋ฅผ ๋ค์ด, "apple"์ ํด์๊ฐ์ด 42๋ผ๊ณ ๊ฐ์ ํ๋ค.
2. ์ ์ฅ ์์น ๊ฒฐ์
• ๊ณ์ฐ๋ ํด์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๊ฒฐ์ ํ๋ค.
• ์๋ฅผ ๋ค์ด, ํด์๊ฐ 42๋ฅผ ๋ฐฐ์ด์ 42๋ฒ ์์น๋ก ๋งคํํ๋ค.
3. Key-Value ์ ์ ์ฅ
• ๊ฒฐ์ ๋ ์์น์ Key์ Value๋ฅผ ํจ๊ป ์ ์ฅํ๋ค.
• ์๋ฅผ ๋ค์ด, "apple"๊ณผ "fruit"๋ฅผ ๋ฐฐ์ด์ 42๋ฒ ์์น์ ์ ์ฅํ๋ค.
4. ๊ฒ์ ์์๋ ๊ฐ์ ๊ณผ์ ๋ฐ๋ณต
• map.get(Key)๋ฅผ ํธ์ถํ๋ฉด HashMap์ Key์ ํด์๊ฐ์ ๊ณ์ฐํ๊ณ , ํด๋น ์์น์์ Key๋ฅผ ์ฐพ์ Value๋ฅผ ๋ฐํํ๋ค
์ฝ๋ ์์ ์ ์๋ ์๋ฆฌ
Map<String, String> map = new HashMap<>();
map.put("apple", "fruit");
map.put("carrot", "vegetable");
System.out.println(map.get("apple")); // ์ถ๋ ฅ: fruit
System.out.println(map.containKey("carrot")); //์ถ๋ ฅ: true
์๋ ๊ณผ์ ์์ธ ์ค๋ช
1. Key “apple”๊ณผ Value “fruit” ์ ์ฅ
map.put("apple", "fruit")๊ฐ ํธ์ถ๋๋ฉด:
1. "apple"์ ํด์๊ฐ์ ๊ณ์ฐํ๋ค.
2. ๊ณ์ฐ๋ ํด์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐ์ด์ ํน์ ์์น๋ฅผ ์ฐพ๋๋ค.
3. ๋ฐฐ์ด์ ํด๋น ์์น์ "apple"๊ณผ "fruit"๋ฅผ Key-Value ์์ผ๋ก ์ ์ฅํ๋ค.
• ์๋ฅผ ๋ค์ด, ํด์๊ฐ 42 → ๋ฐฐ์ด์ 42๋ฒ ์์น์ ์ ์ฅ๋๋ค.
2. Key “carrot”๊ณผ Value “vegetable” ์ ์ฅ
map.put("carrot", "vegetable")๊ฐ ํธ์ถ๋๋ฉด:
1. "carrot"์ ํด์๊ฐ์ ๊ณ์ฐํ๋ค.
2. ๊ณ์ฐ๋ ํด์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐ์ด์ ๋ ๋ค๋ฅธ ์์น๋ฅผ ์ฐพ๋๋ค.
3. ๋ฐฐ์ด์ ํด๋น ์์น์ "carrot"๊ณผ "vegetable"๋ฅผ Key-Value ์์ผ๋ก ์ ์ฅํ๋ค.
• ์๋ฅผ ๋ค์ด, ํด์๊ฐ 53 → ๋ฐฐ์ด์ 53๋ฒ ์์น์ ์ ์ฅ๋๋ค.
3. Value ๊ฒ์: map.get(“apple”)
map.get("apple")์ด ํธ์ถ๋๋ฉด:
1. "apple"์ ํด์๊ฐ์ ๋ค์ ๊ณ์ฐํ๋ค.
2. ํด๋น ํด์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐ์ด์ ์์น(์: 42๋ฒ)๋ฅผ ์ฐพ๋๋ค.
3. ๋ฐฐ์ด์ 42๋ฒ ์์น์์ Key "apple"๊ณผ ์ฐ๊ฒฐ๋ Value "fruit"๋ฅผ ๋ฐํํ๋ค.
4. Key ์กด์ฌ ์ฌ๋ถ ํ์ธ: map.containsKey(“carrot”)
map.containsKey("carrot")๊ฐ ํธ์ถ๋๋ฉด:
1. "carrot"์ ํด์๊ฐ์ ๊ณ์ฐํ๋ค.
2. ํด๋น ํด์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐ์ด์ ์์น(์: 53๋ฒ)๋ฅผ ์ฐพ๋๋ค.
3. ๋ฐฐ์ด์ 53๋ฒ ์์น์์ Key "carrot"์ด ์กด์ฌํ๋์ง ํ์ธํ๋ค.
4. Key๊ฐ ์กด์ฌํ๋ฏ๋ก true๋ฅผ ๋ฐํํ๋ค.
HashMap์ ๋ด๋ถ ๊ตฌ์กฐ
HashMap์ ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด + ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋๋ ๋ฐฐ์ด + ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
1. ๋ฐฐ์ด(Bucket)
• ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ด๋ค.
• ํด์๊ฐ์ ๋ฐ๋ผ Key-Value ์์ด ์ ์ฅ๋๋ค.
2. ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Linked List)
• ํด์๊ฐ์ด ๊ฐ์ Key๊ฐ ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ, ์ถฉ๋์ด ๋ฐ์ํ๋ค.
• ์ด๋, ์ถฉ๋๋ Key-Value ์์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ ์ฅํ๋ค.
3. ํธ๋ฆฌ ๊ตฌ์กฐ(Tree)
• ๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ฉด ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ์๋๋ฅผ ์ ์งํ๋ค.
HashMap์ ์ฅ์
1. ๋น ๋ฅธ ๋ฐ์ดํฐ ๊ฒ์
• ํด์๊ฐ์ ์ฌ์ฉํด ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ๋ฏ๋ก, ๋ฐ์ดํฐ ๊ฒ์ ์๋๊ฐ ํ๊ท ์ ์ผ๋ก O(1)์ด๋ค.
2. Key-Value ๊ด๊ณ ๊ด๋ฆฌ
• Key๋ฅผ ํตํด ๊ด๋ จ๋ Value๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์๋ค.
3. ์ ์ฐํ Key
• Key๋ก ๋ฌธ์์ด, ์ซ์, ๊ฐ์ฒด ๋ฑ ๋ค์ํ ์๋ฃํ์ ์ฌ์ฉํ ์ ์๋ค.
HashMap์ ์ฃผ์์
1. Key๋ ๊ณ ์ ํด์ผ ํจ
• Key๋ ์ค๋ณต๋ ์ ์์ผ๋ฉฐ, ์ค๋ณต๋ Key๋ฅผ ๋ฃ์ผ๋ฉด ๊ธฐ์กด Value๊ฐ ๋ฎ์ด์์์ง๋ค.
map.put("apple", "fruit");
map.put("apple", "snack");
System.out.println(map.get("apple")); // ์ถ๋ ฅ: snack (๋ฎ์ด์์์ง)
2. ํด์ ์ถฉ๋
• ์๋ก ๋ค๋ฅธ Key๊ฐ ๊ฐ์ ํด์๊ฐ์ ๊ฐ์ง ๊ฒฝ์ฐ ์ถฉ๋์ด ๋ฐ์ํ๋ค.
• HashMap์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์ถฉ๋์ ํด๊ฒฐํ๋ค.
์์ฝ
• HashMap์ ์๋ฆฌ
Key์ ํด์๊ฐ์ ๊ณ์ฐํ์ฌ ์ ์ฅ ์์น๋ฅผ ์ฐพ๊ณ , Key์ Value๋ฅผ ๋ฐฐ์ด์ ํจ๊ป ์ ์ฅํ๋ฉฐ, ๊ฒ์ ์์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก Value๋ฅผ ๋ฐํํ๋ค.
• ์ฃผ์ ๋ฉ์๋
- put(Key, Value): Key-Value ์์ ์ ์ฅํ๋ค.
- get(Key): Key์ ํด๋นํ๋ Value๋ฅผ ๋ฐํํ๋ค.
- containsKey(Key): Key๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ค.
'๐ฐ๐ท ํ๊ตญ์ด (Korean) > Java Algorithm Coding Test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Java] ํฉํ ๋ฆฌ์ผ ๊ฐ๋ ๊ณผ ์ฝ๋๋ก ํ์ด๋ด๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ (0) | 2024.12.16 |
|---|---|
| [Java] ์ฝ์ ์ ๋ ฌ(Insertion Sort) ์๋ฆฌ ์ดํดํ๊ธฐ (0) | 2024.12.16 |
| [Java] ๋ฐฐ์ด ์๋ฅด๊ธฐ (๋ฐฐ์ด์ ํญ์ ์ธ๋ฑ์ค 0๋ถํฐ ์์๋๋ค.) (0) | 2024.12.08 |
| [Java] ์์ ๋ฐฐ์ด์ ๊ธธ์ด (0) | 2024.12.06 |
| [Java] ๋ฒ๋ธ๋ฐฐ์ด ๋ฌธ์ ํ์ด (1) | 2024.12.05 |