프로그래머스 - 소인수분해
import java.util.LinkedHashSet;
import java.util.Set;
class Solution {
public int[] solution(int n) {
Set<Integer> set = new LinkedHashSet<>();
for(int i=2; i<=n; i++) {
if(n%i==0) {
set.add(i);
n = n/i;
}
}
int count =0;
for(int k=2; k<=n; k++) {
if(n%k==0)
count++;
}
if(count==1)
set.add(n);
count = 0;
Set<Integer> nonPrimes = new LinkedHashSet<>();
for(Integer a : set) {
for(int j=2; j<=a; j++) {
if(a%j==0) count++;
}
if(count!=1) {
nonPrimes.add(a);
}
count = 0;
}
set.removeAll(nonPrimes);
return set.stream()
.mapToInt(Integer::intValue)
.toArray();
}
}
- 소인수분해
- 반복문으로 어떻게 할 수 있을지 고민하다가, 직접 하는 영상을 보니 i는 증가하고, 나누는 수는 감소하는것을 힌트로 얻었다.
- 이렇게 하면 가장 마지막에 남는 n이 i보다 작아지면 나누지 않으니 소수인지 검사를 해준다.
- 단 이렇게 하면, i가 소수가 아닐때도 나누어 떨어진다.
- Set에 있는 요소 검사 필요
ex) 252

- Set 요소들을 순회 하면서 remove를 해주면 Exception 발생할 수도 있으므로, 별도 Set을 만들고 순회 다 한다음에 removeAll을 해준다.
- LinkedHashSet의 경우 순서를 보장해주니 별도 sort를 하지 않음