소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 2 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
생각한 풀이
1. for문으로 2부터 n까지 소인수인지 확인하고 맞다면 배열에 추가
2. 배열의 크기는 n으로 설정해서 모든 수가 들어갈수 있게 한다
3. 중복제거
import java.util.ArrayList;
class Solution {
public int[] solution(int n) {
int[] num = new int[n];
int index = 0;
for (int i=2;i<=n;i++) {
while (n%i== 0) {
num[index++] = i;
n /= i;
}
}
return Arrays.stream(num, 0, index).distinct().toArray();
}
}
🐴 풀이
1. n 크기의 배열 생성
2. for문은 2부터(1은 소수가 아님) n까지 돌면서 소인수인지 체크
3. while문 내부에서는 n이 i로 나누어 떨어지는 값들을 중복을 허용해서 num에 넣는다
3. 마지막 distinct()를 사용하기위해 num을 stream으로 변경하고 중복을 제거하고 다시 toArray()로 변경한다.
4. Arrays.stream(num, 0, index)는 num 배열을 0부터 index까지 스트림으로 만든다고 선언하는 것이다
중복제거를 위해 stream을 사용하기전에 num을 동적 리스트로 만들어 푼 방식
import java.util.ArrayList;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> num = new ArrayList<>();
for(int i=2;i<=n;i++){
while(n%i==0){
if(!num.contains(i)){
num.add(i);
}
n/=i;
}
}
int answer[]= new int[num.size()];
for(int i=0;i<answer.length;i++){
answer[i]=num.get(i);
}
return answer;
}
}
🐴 풀이
1. ArrayList로 동적으로 num 생성
2. for문 내부 로직은 동일한데 contains()로 중복 확인을 바로한다
3. 이후 num의 사이즈와 동일한 배열을 만들어 num 내부의 값들을 받아온다