๐ 1. ๋ฌธ์ ์ค๋ช

์ ์ถ๋ ฅ ์ ์ค๋ช
์
์ถ๋ ฅ ์ #1
- 12๋ฅผ ์์ธ์๋ถํดํ๋ฉด 2 * 2 * 3 ์ ๋๋ค. ๋ฐ๋ผ์ [2, 3]์ returnํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #2
- 17์ ์์์ ๋๋ค. ๋ฐ๋ผ์ [17]์ return ํด์ผ ํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #3
- 420์ ์์ธ์๋ถํดํ๋ฉด 2 * 2 * 3 * 5 * 7 ์ ๋๋ค. ๋ฐ๋ผ์ [2, 3, 5, 7]์ returnํฉ๋๋ค.
๐ก 2. ํ์ด๊ณผ์
์ค๋ณต์ ์ ๊ฑฐํ๋ฉด์ ์์๋ฅผ ์ ์งํ๋ ค๊ณ LinkedHashSet<>์ ์ฌ์ฉํด์ ํ์๋ค.
1. for๋ฌธ์ ๋ฒ์๋ `i * i <= n`๊น์ง๋ง ์ค์ ํ๋ค
2. while (n % i == 0)๋ก ์ค๋ณต๋๋ ์์ธ์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ
3. ๋ง์ง๋ง์ ๋จ์ ์๊ฐ n > 1์ธ์ง ํ์ธํด์ ์์๋ฅผ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๊ฐํ๊ธฐ
์์ธ์๋ถํด ๊ณผ์ ์์ ๊ฐ์ ์์๊ฐ ์ฌ๋ฌ ๋ฒ ๋์ฌ ์ ์๋ค. ์๋ฅผ ๋ค์ด, 12 = 2 ร 2 ร 3 ์ด์ง๋ง, ์์ธ์ ๋ชฉ๋ก์๋ 2์ 3๋ง ํฌํจ๋์ด์ผ ํ๋ค. Set์ ์ค๋ณต์ ์๋์ผ๋ก ์ ๊ฑฐํด์ฃผ๋ฏ๋ก, ๊ฐ์ ์์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ถ๊ฐํด๋ ํ๋๋ง ์ ์ฅ๋๋ค. Set ํ์ ์ ์๋ฃํ์ ๊ณตํต์ ์ผ๋ก ์ค๋ณต์ ์ ๊ฑฐํ๋ ํน์ง์ด ์์ง๋ง, Set์๋ ์ข ๋ฅ๊ฐ ์๋ค. HashSet์ ์์๋ฅผ ๋ณด์ฅํ์ง ์๊ณ , LinkedHashSet์ ์์๋ฅผ ์ ์งํ๋ค. ์ฐธ๊ณ ๋ก TreeSet๋ ์๋์ ๋ ฌ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ๊ฒ์ด๋ ์ธ ์ ์๋ค.
๋ด ์๊ฐ์๋ HashSet ์ด๋ LinkedHashSet์ stream์ผ๋ก ๋ณํํด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํด ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋ฐ๋ฉด TreeSet์ ์๋์ผ๋ก ์ ๋ ฌํ๋๊น ๋ ๋น ๋ฅธ๊ฑฐ ์๋๊ฐ?
๋๋ ๋ฌธ์ ์์๋ ์์๋ค์ ์์ ์ซ์๋ถํฐ ์์๋๋ก ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฒ์์๋ ์ฝ์
์์๋ฅผ ์ ์งํ๋ `LinkedHashSet<>`์ ์ฌ์ฉํด์ ํ์๋ค. ์ด์ฐจํผ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ค์ด์ค๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ ๊ธฐํ ๊ฑด ์์ ์์ด ์์๋ฅผ ๋๋ค ๋ฐํํ๋ HashSet<>์ผ๋ก ํผ ์ฝ๋๋ ๋์๊ฐ๋ค.
์ ๋ ฌ๋ ํ์ง ์๊ณ ๋ฐ๋ก ๋ฐฐ์ด๋ก ๋ฐ๊ฟจ๋๋ฐ ํ ์คํธ ์ผ์ด์ค 3๊ฐ๊ฐ ๋ค ํต๊ณผ๋จ..
๊ทธ๋ฅ ์ฐ์ฐ์ผ๊น ํด์ ๋ค์ ๋๋ ธ๋๋ฐ ๊ณ์ ํต๊ณผ๋จ...
์ ๋ ฌ์ ์ํํ๋ ์ฝ๋๊ฐ ์๋๋ฐ HashSet<>์ด ๋๋ค๊ณ ?
๐จโ๐ป 3. ์ ๋ต์ฝ๋
import java.util.*;
class Solution {
public int[] solution(int n) {
Set<Integer> primeFacs = new LinkedHashSet<>();
// 2๋ถํฐ n๊น์ง ๋๋์ด ๋จ์ด์ง๋ ์ ์ฐพ๊ธฐ
for (int i= 2; i * i <= n; i++ ) {
while (n % i == 0) {
primeFacs.add(i);
n /= i;
}
}
// n์ด ๋ง์ง๋ง์ผ๋ก ๋จ์ ์์๋ฉด ์ถ๊ฐํ๊ธฐ
if (n > 1) primeFacs.add(n);
// Set โ ๋ฐฐ์ด๋ก ๋ณํ
return primeFacs.stream().mapToInt(Integer::intValue).toArray();
}
}
`for (int i = 2; i * i <= n; i++)`๋ฅผ ์ฌ์ฉํ๋ ์ด์
์์ธ์๋ถํด๋ฅผ ํ ๋, ๋ฐ๋ณต๋ฌธ์ ์กฐ๊ฑด์ i * i <= n์ผ๋ก ์ค์ ํ๋ ์ด์ ๋ ์ต์ ํ๋ฅผ ์ํด์์ด๋ค.
์ฆ, i๊ฐ โn๊น์ง๋ง ๊ฒ์ฌํ๋ฉด ์ถฉ๋ถํ๋ค. (๊ฒ์์ ํตํด์ ์ฐพ์๋ณด์๋ค.)
๋ง์ฝ ์ด๊ฑธ ์์ ํ์(Brute Force) ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ค๊ณ ๊ฐ์ ํ๋ฉด,
`i * i <= n`์ด ์๋๋ผ `i <= n`๊น์ง ๊ฒ์ฌํ๋๋ก ํด์ผ ๊ฒ ์ง? ๊ทธ๋ฌ๋ฉด
์๋ฅผ ๋ค์ด n = 100์ผ ๋,
i = 2 โ 100 % 2 == 0
i = 3 โ 100 % 3 != 0
i = 4 โ 100 % 4 == 0
...
์ด๋ ๊ฒ 100๊น์ง ๋ฐ๋ณตํ๋ฉด, ๋ถํ์ํ ์ฐ์ฐ์ด ๋ง์ ์๋๊ฐ ๋๋ ค์ง๋ค.
์ด ๋ฌธ์ ์์ ์ค์ํ ๊ฒ์ ์์ธ์๋ฅผ ์ฐพ์ ๋ i * i <= n๊น์ง๋ง ๊ฒ์ฌํ๋ฉด ์ถฉ๋ถํ๋ค๋ ๊ฒ์ด๋ค.
โ
์์ธ์๋ ํญ์ โn ์ดํ์ ์์ธ์ ์ค์์ ์ฐพ์ ์ ์๋ค.
โ
์ฆ, n = a ร b๋ผ๋ฉด, a ๋๋ b ์ค ํ๋๋ โn ์ดํ์ด๋ค.
โ ๋ฐ๋ผ์ ํ์ ๋ฒ์๋ฅผ i * i <= n ๊น์ง๋ก ์ค์ ํ๋ค. โn๊น์ง๋ง ๊ฒ์ฌํ๋ฉด ๋ชจ๋ ์์ธ์๋ฅผ ์ฐพ์ ์ ์๋ค.
"์์ธ์๋ ํญ์ โn ์ดํ์ ์์ธ์ ์ค์์ ์ฐพ์ ์ ์๋ค"๋ ๊ฒ์ ์๋ฏธ์ ๋ํด์ ์ค๋ช ํ์๋ฉด
1. ์ด๋ค ์ n์ด ๋ ๊ฐ์ ์ a์ b์ ๊ณฑ์ผ๋ก ํํ๋ ์ ์๋ค๊ณ ๊ฐ์ ํ์.
n = a * b
๋ผ๊ณ ํ ๋, ํญ์ a ๋๋ b ์ค ํ๋๋ โn ์ดํ์ด๋ค.
๋ง์ฝ a > โn์ด๊ณ b > โn์ด๋ผ๋ฉด
n = a * b > โn * โn = n
์ด ๋์ด n๋ณด๋ค ํฐ ๊ฐ์ด ๋์ค๋ฏ๋ก ๋ชจ์์ด ๋๋ค.
์ฆ, ๋ ๊ฐ์ ์์ธ์ ์ค ํ๋๋ ๋ฐ๋์ โn ์ดํ์ด์ด์ผ ํ๋ค.
์ค์ ์ซ์์ธ `n = 100` ์ ์๋ก ๋ค๋ฉด, 100์ ์์ธ์๋ 2์ 5์ด๋ค.
100 = 2 * 2 * 5 * 5
โ100 = 10
2, 5 ์ค์์ ์ต์ ํ๋ ์ด์์ 10 ์ดํ์ด๋ค.
๋ฐ๋ผ์, 10 ์ดํ์ ์์(2, 3, 5, 7)๋ง ๊ฒ์ฌํ๋ฉด ๋ชจ๋ ์์ธ์๋ฅผ ์ฐพ์ ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก 400์ ์์ธ์๋ 20 ์ดํ์์ ๋ชจ๋ ์ฐพ์ ์ ์๋ค.
๐๐ป 4. ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ์ํ HashSet<> ์ด ํต๊ณผ๋๋ ํ์
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
class Solution {
public Integer[] solution(int n) {
Set<Integer> hashSet = new HashSet<>();
int factor = n;
int divisor = 2;
while (factor >= 2) {
if (factor % divisor == 0) {
factor /= divisor;
hashSet.add(divisor);
} else {
divisor++;
}
}
return hashSet.toArray(new Integer[0]);
}
}
stream ์์ฐ๊ณ `return hashSet.toArray(new Integer[0]);` ๋ฅผ ์ฐ๋ฉด HashSet์ ๋ชจ๋ ์์๋ฅผ Integer[] ๋ฐฐ์ด๋ก ๋ณํํ๊ณ , ๊ทธ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
์๋๋ ๊ทธ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ฒฐ์ ํ ์๋ ์๋ค. ํ์ง๋ง new Integer[0]๋ฅผ ์ธ์๋ก ๋๊ธฐ๋ฉด, ๋ฐฐ์ด์ ํ์
์ ๋ช
์์ ์ผ๋ก Integer[]๋ก ์ง์ ํ๊ฒ ๋๋ค. 0์ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ ๊ฐ์ด๋ค, ์ด ๊ฒฝ์ฐ HashSet์ ํฌ๊ธฐ์ ๋ง๋ ๋ฐฐ์ด์ ์๋์ผ๋ก ์์ฑํ๊ธฐ ์ํด 0์ ์ฌ์ฉํ๋ค.

HashSet์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ์ง ์๊ณ ๋๋ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋๋ฐ ํ ์คํธ๊ฐ ํต๊ณผ๋์๋ค.
์ฒ์์๋ ์ฐ์ฐ์ผ๋ก ์์๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ํ์ฑ๋์ด์ ํต๊ณผ๋ ์ค ์์๋๋ฐ ์ฌ๋ฌ ๋ฒ ๋๋ ค๋ ํต๊ณผ๊ฐ ๋จ
๋ด ์๊ฐ์ ํ๋ก๊ทธ๋๋จธ์ค ์์ฒด ์ฝ์์์ HashSet ๊ตฌํ์ด ๋ด๋ถ์ ์ผ๋ก ์ ๋ ฌ๋ ์์๋ฅผ ๋ฐ์ํ๋๋ก ๋์๋๊ฒ ๋ง๋ค์ด ๋์๊ธฐ ๋๋ฌธ์ด์๋๊น ์ถ๋ค... ๊ทธ๋ ์ง ์๊ณ ์์ผ ์ด๊ฒ ๊ฐ๋ฅํ๋ค๊ณ ?
ํ์คํ ๊ฑด ์ค์ ๋ก๋ HashSet์ ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. HashSet<>์ ๋ด๋ถ์ ์ผ๋ก ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ฝ์ ์์๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋์ง ์๋๋ค. ์ด๋๊น์ง๋ ๊ตฌํ ์ธ๋ถ์ฌํญ์ด๋ ์ฐ์ฐ์ ์ธ ์ํฉ์ผ๋ก, ์ ํํ๊ฒ ๋ณด์ฅ๋์ง ์๋๋ค.
ํน์ ์ฌ๊ธฐ์ ๋ํด ์ ํํ๊ฒ ์์๋ ๋ถ์ ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค.
๐ฆ 5. TreeSet vs HashSet vs LinkedSet
โ TreeSet
TreeSet์ ์ฌ์ฉํ ๊ฒฝ์ฐ (์๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ)์ ํ๋ค. ๊ทธ๋์ ๋ฐ๋ก toArray()๋ก ๋ฐฐ์ด์ ๋ณํํ๋ฉด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ป์ ์ ์์ผ๋ฏ๋ก return ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๋ค.
return treeSet.toArray(new Integer[0]);
โ LinkedHashSet
LinkedHashSet์ ์ฝ์ ์์๋ฅผ ์ ์งํ๋ฏ๋ก ์์ ์๋ถํฐ ์ ์ฅ๋๋ค๋ฉด, ๋ฐํ๋ ๋ ์ด๋ฏธ ์ค๋ฆ์ฐจ์์ผ๋ก ๋์ฌ ๊ฒ์ด๋ผ๊ณ ์์ํ์ผ๋ ์์๊ณผ ๋ฌ๋ฆฌ linkedList์์๋ ๋ฐ๋ก ๋ฐฐ์ด ๋ณํํ๋ ๋ฉ์๋๊ฐ ๋จนํ์ง ์๋๋ค.
return primeFacs.toArray(new Integer[0]);
๊ทธ๋์ HashSet๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํธ๋ฆผ์ ์์ฑํ๊ณ ์ค๋ฆ์ฐจ์์ ์ ๋ ฌํ ํ, ๋ฐฐ์ด๋ก ๋ณํ์ ํ๋๊น ํต๊ณผ๊ฐ ๋๋ค.
return primeFacs.stream().sorted().toArray(Integer[]::new); // ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ ๋ฐฐ์ด๋ก ๋ณํ
โ HashSet
HashSet์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์คํธ๋ฆผ์ ์์ฑํ๊ณ , .sorted()๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ ํ, .toArray(Integer[]::new)๋ก ๋ฐฐ์ด๋ก ๋ณํํ๋ค.
return hashSet.stream().sorted().toArray(Integer[]::new);
๊ทธ๋์ ๊ฒฐ๋ก ์ ์ผ๋ก LinkedHashSet๊ฐ ์์๋ฅผ ๊ฐ์ง๋ค ํด๋, HashSet๊ณผ return ์ฝ๋๋ ๋ณ ์ฐจ์ด๊ฐ ์๋ค.
์คํธ๋ฆผ์ ์ฌ์ฉํ์ฌ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ , ๋ฐฐ์ด๋ก ๋ณํํ๋ ๋ฐฉ์์ ๋์ผํ๋ค๋ ๊ฒ์ด๋ค.
๋ ๋ค stream().sorted().toArray(Integer[]::new)๋ก ์ฒ๋ฆฌํด์ผ๋ง ์ค๋ฆ์ฐจ์ ๋ฐฐ์ด์ ์ป์ ์ ์๋ค.
int[] answer = factorList.stream().mapToInt(i -> i).toArray(); ์๋ณด๋ค
return primeFacs.stream().mapToInt(Integer::intValue).toArray(); ์๊ฐ ๋ ๋ง์ด ์ฐ์
'Algorithm > JAVAํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ๋ฐฐ์ด ์์์ ๊ธธ์ด ๋ฌธ์ ํ์ด (8) | 2025.03.30 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ปจํธ๋กค ์ ํธ ๋ฌธ์ ํ์ด (4) | 2025.03.30 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์จ์ด์๋ ์ซ์์ ๋ง์ (1) ๋ฌธ์ ํ์ด (1) | 2025.03.27 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ๋ฌธ์์ด ์ ๋ ฌํ๊ธฐ (1) ๋ฌธ์ ํ์ด (1) | 2025.03.27 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ๋ชจ์ ์ ๊ฑฐ ๋ฌธ์ ํ์ด (5) | 2025.03.27 |
๐ 1. ๋ฌธ์ ์ค๋ช

์ ์ถ๋ ฅ ์ ์ค๋ช
์
์ถ๋ ฅ ์ #1
- 12๋ฅผ ์์ธ์๋ถํดํ๋ฉด 2 * 2 * 3 ์ ๋๋ค. ๋ฐ๋ผ์ [2, 3]์ returnํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #2
- 17์ ์์์ ๋๋ค. ๋ฐ๋ผ์ [17]์ return ํด์ผ ํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #3
- 420์ ์์ธ์๋ถํดํ๋ฉด 2 * 2 * 3 * 5 * 7 ์ ๋๋ค. ๋ฐ๋ผ์ [2, 3, 5, 7]์ returnํฉ๋๋ค.
๐ก 2. ํ์ด๊ณผ์
์ค๋ณต์ ์ ๊ฑฐํ๋ฉด์ ์์๋ฅผ ์ ์งํ๋ ค๊ณ LinkedHashSet<>์ ์ฌ์ฉํด์ ํ์๋ค.
1. for๋ฌธ์ ๋ฒ์๋ i * i <= n
๊น์ง๋ง ์ค์ ํ๋ค
2. while (n % i == 0)๋ก ์ค๋ณต๋๋ ์์ธ์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ
3. ๋ง์ง๋ง์ ๋จ์ ์๊ฐ n > 1์ธ์ง ํ์ธํด์ ์์๋ฅผ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๊ฐํ๊ธฐ
์์ธ์๋ถํด ๊ณผ์ ์์ ๊ฐ์ ์์๊ฐ ์ฌ๋ฌ ๋ฒ ๋์ฌ ์ ์๋ค. ์๋ฅผ ๋ค์ด, 12 = 2 ร 2 ร 3 ์ด์ง๋ง, ์์ธ์ ๋ชฉ๋ก์๋ 2์ 3๋ง ํฌํจ๋์ด์ผ ํ๋ค. Set์ ์ค๋ณต์ ์๋์ผ๋ก ์ ๊ฑฐํด์ฃผ๋ฏ๋ก, ๊ฐ์ ์์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ถ๊ฐํด๋ ํ๋๋ง ์ ์ฅ๋๋ค. Set ํ์ ์ ์๋ฃํ์ ๊ณตํต์ ์ผ๋ก ์ค๋ณต์ ์ ๊ฑฐํ๋ ํน์ง์ด ์์ง๋ง, Set์๋ ์ข ๋ฅ๊ฐ ์๋ค. HashSet์ ์์๋ฅผ ๋ณด์ฅํ์ง ์๊ณ , LinkedHashSet์ ์์๋ฅผ ์ ์งํ๋ค. ์ฐธ๊ณ ๋ก TreeSet๋ ์๋์ ๋ ฌ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ๊ฒ์ด๋ ์ธ ์ ์๋ค.
๋ด ์๊ฐ์๋ HashSet ์ด๋ LinkedHashSet์ stream์ผ๋ก ๋ณํํด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํด ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋ฐ๋ฉด TreeSet์ ์๋์ผ๋ก ์ ๋ ฌํ๋๊น ๋ ๋น ๋ฅธ๊ฑฐ ์๋๊ฐ?
๋๋ ๋ฌธ์ ์์๋ ์์๋ค์ ์์ ์ซ์๋ถํฐ ์์๋๋ก ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฒ์์๋ ์ฝ์
์์๋ฅผ ์ ์งํ๋ LinkedHashSet<>
์ ์ฌ์ฉํด์ ํ์๋ค. ์ด์ฐจํผ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ค์ด์ค๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ ๊ธฐํ ๊ฑด ์์ ์์ด ์์๋ฅผ ๋๋ค ๋ฐํํ๋ HashSet<>์ผ๋ก ํผ ์ฝ๋๋ ๋์๊ฐ๋ค.
์ ๋ ฌ๋ ํ์ง ์๊ณ ๋ฐ๋ก ๋ฐฐ์ด๋ก ๋ฐ๊ฟจ๋๋ฐ ํ ์คํธ ์ผ์ด์ค 3๊ฐ๊ฐ ๋ค ํต๊ณผ๋จ..
๊ทธ๋ฅ ์ฐ์ฐ์ผ๊น ํด์ ๋ค์ ๋๋ ธ๋๋ฐ ๊ณ์ ํต๊ณผ๋จ...
์ ๋ ฌ์ ์ํํ๋ ์ฝ๋๊ฐ ์๋๋ฐ HashSet<>์ด ๋๋ค๊ณ ?
๐จโ๐ป 3. ์ ๋ต์ฝ๋
import java.util.*; class Solution { public int[] solution(int n) { Set<Integer> primeFacs = new LinkedHashSet<>(); // 2๋ถํฐ n๊น์ง ๋๋์ด ๋จ์ด์ง๋ ์ ์ฐพ๊ธฐ for (int i= 2; i * i <= n; i++ ) { while (n % i == 0) { primeFacs.add(i); n /= i; } } // n์ด ๋ง์ง๋ง์ผ๋ก ๋จ์ ์์๋ฉด ์ถ๊ฐํ๊ธฐ if (n > 1) primeFacs.add(n); // Set โ ๋ฐฐ์ด๋ก ๋ณํ return primeFacs.stream().mapToInt(Integer::intValue).toArray(); } }
for (int i = 2; i * i <= n; i++)
๋ฅผ ์ฌ์ฉํ๋ ์ด์
์์ธ์๋ถํด๋ฅผ ํ ๋, ๋ฐ๋ณต๋ฌธ์ ์กฐ๊ฑด์ i * i <= n์ผ๋ก ์ค์ ํ๋ ์ด์ ๋ ์ต์ ํ๋ฅผ ์ํด์์ด๋ค.
์ฆ, i๊ฐ โn๊น์ง๋ง ๊ฒ์ฌํ๋ฉด ์ถฉ๋ถํ๋ค. (๊ฒ์์ ํตํด์ ์ฐพ์๋ณด์๋ค.)
๋ง์ฝ ์ด๊ฑธ ์์ ํ์(Brute Force) ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ค๊ณ ๊ฐ์ ํ๋ฉด,
i * i <= n
์ด ์๋๋ผ i <= n
๊น์ง ๊ฒ์ฌํ๋๋ก ํด์ผ ๊ฒ ์ง? ๊ทธ๋ฌ๋ฉด
์๋ฅผ ๋ค์ด n = 100์ผ ๋,
i = 2 โ 100 % 2 == 0
i = 3 โ 100 % 3 != 0
i = 4 โ 100 % 4 == 0
...
์ด๋ ๊ฒ 100๊น์ง ๋ฐ๋ณตํ๋ฉด, ๋ถํ์ํ ์ฐ์ฐ์ด ๋ง์ ์๋๊ฐ ๋๋ ค์ง๋ค.
์ด ๋ฌธ์ ์์ ์ค์ํ ๊ฒ์ ์์ธ์๋ฅผ ์ฐพ์ ๋ i * i <= n๊น์ง๋ง ๊ฒ์ฌํ๋ฉด ์ถฉ๋ถํ๋ค๋ ๊ฒ์ด๋ค.
โ
์์ธ์๋ ํญ์ โn ์ดํ์ ์์ธ์ ์ค์์ ์ฐพ์ ์ ์๋ค.
โ
์ฆ, n = a ร b๋ผ๋ฉด, a ๋๋ b ์ค ํ๋๋ โn ์ดํ์ด๋ค.
โ ๋ฐ๋ผ์ ํ์ ๋ฒ์๋ฅผ i * i <= n ๊น์ง๋ก ์ค์ ํ๋ค. โn๊น์ง๋ง ๊ฒ์ฌํ๋ฉด ๋ชจ๋ ์์ธ์๋ฅผ ์ฐพ์ ์ ์๋ค.
"์์ธ์๋ ํญ์ โn ์ดํ์ ์์ธ์ ์ค์์ ์ฐพ์ ์ ์๋ค"๋ ๊ฒ์ ์๋ฏธ์ ๋ํด์ ์ค๋ช ํ์๋ฉด
1. ์ด๋ค ์ n์ด ๋ ๊ฐ์ ์ a์ b์ ๊ณฑ์ผ๋ก ํํ๋ ์ ์๋ค๊ณ ๊ฐ์ ํ์.
n = a * b
๋ผ๊ณ ํ ๋, ํญ์ a ๋๋ b ์ค ํ๋๋ โn ์ดํ์ด๋ค.
๋ง์ฝ a > โn์ด๊ณ b > โn์ด๋ผ๋ฉด
n = a * b > โn * โn = n
์ด ๋์ด n๋ณด๋ค ํฐ ๊ฐ์ด ๋์ค๋ฏ๋ก ๋ชจ์์ด ๋๋ค.
์ฆ, ๋ ๊ฐ์ ์์ธ์ ์ค ํ๋๋ ๋ฐ๋์ โn ์ดํ์ด์ด์ผ ํ๋ค.
์ค์ ์ซ์์ธ n = 100
์ ์๋ก ๋ค๋ฉด, 100์ ์์ธ์๋ 2์ 5์ด๋ค.
100 = 2 * 2 * 5 * 5
โ100 = 10
2, 5 ์ค์์ ์ต์ ํ๋ ์ด์์ 10 ์ดํ์ด๋ค.
๋ฐ๋ผ์, 10 ์ดํ์ ์์(2, 3, 5, 7)๋ง ๊ฒ์ฌํ๋ฉด ๋ชจ๋ ์์ธ์๋ฅผ ์ฐพ์ ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก 400์ ์์ธ์๋ 20 ์ดํ์์ ๋ชจ๋ ์ฐพ์ ์ ์๋ค.
๐๐ป 4. ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ์ํ HashSet<> ์ด ํต๊ณผ๋๋ ํ์
import java.util.Arrays; import java.util.HashSet; import java.util.Set; class Solution { public Integer[] solution(int n) { Set<Integer> hashSet = new HashSet<>(); int factor = n; int divisor = 2; while (factor >= 2) { if (factor % divisor == 0) { factor /= divisor; hashSet.add(divisor); } else { divisor++; } } return hashSet.toArray(new Integer[0]); } }
stream ์์ฐ๊ณ return hashSet.toArray(new Integer[0]);
๋ฅผ ์ฐ๋ฉด HashSet์ ๋ชจ๋ ์์๋ฅผ Integer[] ๋ฐฐ์ด๋ก ๋ณํํ๊ณ , ๊ทธ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
์๋๋ ๊ทธ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ฒฐ์ ํ ์๋ ์๋ค. ํ์ง๋ง new Integer[0]๋ฅผ ์ธ์๋ก ๋๊ธฐ๋ฉด, ๋ฐฐ์ด์ ํ์
์ ๋ช
์์ ์ผ๋ก Integer[]๋ก ์ง์ ํ๊ฒ ๋๋ค. 0์ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ ๊ฐ์ด๋ค, ์ด ๊ฒฝ์ฐ HashSet์ ํฌ๊ธฐ์ ๋ง๋ ๋ฐฐ์ด์ ์๋์ผ๋ก ์์ฑํ๊ธฐ ์ํด 0์ ์ฌ์ฉํ๋ค.

HashSet์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ์ง ์๊ณ ๋๋ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋๋ฐ ํ ์คํธ๊ฐ ํต๊ณผ๋์๋ค.
์ฒ์์๋ ์ฐ์ฐ์ผ๋ก ์์๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ํ์ฑ๋์ด์ ํต๊ณผ๋ ์ค ์์๋๋ฐ ์ฌ๋ฌ ๋ฒ ๋๋ ค๋ ํต๊ณผ๊ฐ ๋จ
๋ด ์๊ฐ์ ํ๋ก๊ทธ๋๋จธ์ค ์์ฒด ์ฝ์์์ HashSet ๊ตฌํ์ด ๋ด๋ถ์ ์ผ๋ก ์ ๋ ฌ๋ ์์๋ฅผ ๋ฐ์ํ๋๋ก ๋์๋๊ฒ ๋ง๋ค์ด ๋์๊ธฐ ๋๋ฌธ์ด์๋๊น ์ถ๋ค... ๊ทธ๋ ์ง ์๊ณ ์์ผ ์ด๊ฒ ๊ฐ๋ฅํ๋ค๊ณ ?
ํ์คํ ๊ฑด ์ค์ ๋ก๋ HashSet์ ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. HashSet<>์ ๋ด๋ถ์ ์ผ๋ก ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ฝ์ ์์๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋์ง ์๋๋ค. ์ด๋๊น์ง๋ ๊ตฌํ ์ธ๋ถ์ฌํญ์ด๋ ์ฐ์ฐ์ ์ธ ์ํฉ์ผ๋ก, ์ ํํ๊ฒ ๋ณด์ฅ๋์ง ์๋๋ค.
ํน์ ์ฌ๊ธฐ์ ๋ํด ์ ํํ๊ฒ ์์๋ ๋ถ์ ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค.
๐ฆ 5. TreeSet vs HashSet vs LinkedSet
โ TreeSet
TreeSet์ ์ฌ์ฉํ ๊ฒฝ์ฐ (์๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ)์ ํ๋ค. ๊ทธ๋์ ๋ฐ๋ก toArray()๋ก ๋ฐฐ์ด์ ๋ณํํ๋ฉด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ป์ ์ ์์ผ๋ฏ๋ก return ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๋ค.
return treeSet.toArray(new Integer[0]);
โ LinkedHashSet
LinkedHashSet์ ์ฝ์ ์์๋ฅผ ์ ์งํ๋ฏ๋ก ์์ ์๋ถํฐ ์ ์ฅ๋๋ค๋ฉด, ๋ฐํ๋ ๋ ์ด๋ฏธ ์ค๋ฆ์ฐจ์์ผ๋ก ๋์ฌ ๊ฒ์ด๋ผ๊ณ ์์ํ์ผ๋ ์์๊ณผ ๋ฌ๋ฆฌ linkedList์์๋ ๋ฐ๋ก ๋ฐฐ์ด ๋ณํํ๋ ๋ฉ์๋๊ฐ ๋จนํ์ง ์๋๋ค.
return primeFacs.toArray(new Integer[0]);
๊ทธ๋์ HashSet๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํธ๋ฆผ์ ์์ฑํ๊ณ ์ค๋ฆ์ฐจ์์ ์ ๋ ฌํ ํ, ๋ฐฐ์ด๋ก ๋ณํ์ ํ๋๊น ํต๊ณผ๊ฐ ๋๋ค.
return primeFacs.stream().sorted().toArray(Integer[]::new); // ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ ๋ฐฐ์ด๋ก ๋ณํ
โ HashSet
HashSet์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์คํธ๋ฆผ์ ์์ฑํ๊ณ , .sorted()๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ ํ, .toArray(Integer[]::new)๋ก ๋ฐฐ์ด๋ก ๋ณํํ๋ค.
return hashSet.stream().sorted().toArray(Integer[]::new);
๊ทธ๋์ ๊ฒฐ๋ก ์ ์ผ๋ก LinkedHashSet๊ฐ ์์๋ฅผ ๊ฐ์ง๋ค ํด๋, HashSet๊ณผ return ์ฝ๋๋ ๋ณ ์ฐจ์ด๊ฐ ์๋ค.
์คํธ๋ฆผ์ ์ฌ์ฉํ์ฌ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ , ๋ฐฐ์ด๋ก ๋ณํํ๋ ๋ฐฉ์์ ๋์ผํ๋ค๋ ๊ฒ์ด๋ค.
๋ ๋ค stream().sorted().toArray(Integer[]::new)๋ก ์ฒ๋ฆฌํด์ผ๋ง ์ค๋ฆ์ฐจ์ ๋ฐฐ์ด์ ์ป์ ์ ์๋ค.
int[] answer = factorList.stream().mapToInt(i -> i).toArray(); ์๋ณด๋ค
return primeFacs.stream().mapToInt(Integer::intValue).toArray(); ์๊ฐ ๋ ๋ง์ด ์ฐ์
'Algorithm > JAVAํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ๋ฐฐ์ด ์์์ ๊ธธ์ด ๋ฌธ์ ํ์ด (8) | 2025.03.30 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ปจํธ๋กค ์ ํธ ๋ฌธ์ ํ์ด (4) | 2025.03.30 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์จ์ด์๋ ์ซ์์ ๋ง์ (1) ๋ฌธ์ ํ์ด (1) | 2025.03.27 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ๋ฌธ์์ด ์ ๋ ฌํ๊ธฐ (1) ๋ฌธ์ ํ์ด (1) | 2025.03.27 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ๋ชจ์ ์ ๊ฑฐ ๋ฌธ์ ํ์ด (5) | 2025.03.27 |