[프로그래머스]소인수분해
소인수분해
문제 설명
소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 * 2 * 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 2 ≤ n ≤ 10,000
입출력 예
n | result |
---|---|
12 | [2, 3] |
17 | [17] |
420 | [2, 3, 5, 7] |
입출력 예 설명
입출력 예 #1
- 12를 소인수분해하면 2 * 2 * 3 입니다. 따라서 [2, 3]을 return합니다.
입출력 예 #2
- 17은 소수입니다. 따라서 [17]을 return 해야 합니다.
입출력 예 #3
- 420을 소인수분해하면 2 * 2 * 3 * 5 * 7 입니다. 따라서 [2, 3, 5, 7]을 return합니다.
나의 풀이 코드
import java.util.*;
class Solution {
public static boolean isPrime(int num){
if(num < 2) return false; // 0 또는 1은 소수가 아님
if(num == 2) return true; // 2는 소수
for(int i = 2; i <= Math.sqrt(num); i++){// 그외의 수
if(num % i == 0){ //num보다 아래수에서 나눠지는 수가 있으면 소수가 아님
return false;
}
}
return true; //안나왔으면 소수
}
public Integer[] solution(int n) {
ArrayList<Integer> divisor_list = new ArrayList<>();
ArrayList<Integer> prime_list = new ArrayList<>();
//1.전체 약수를 모두 구하고
for(int i = 1; i <= n; i++){
if(n % i == 0){
divisor_list.add(i);
}
}
//2.약수중에 소수만 필터링
for(int i = 0; i < divisor_list.size(); i++){ //약수 하나씩 가져오기
if(isPrime(divisor_list.get(i))){ //소수 판별
prime_list.add(divisor_list.get(i));
}
}
Integer[] answer = prime_list.toArray(new Integer[0]);
return answer;
}
}
주석에 적어놓았듯이 n의 약수들을 구한뒤에 소수만 필터링하는 코드이다.
배운점
import java.util.LinkedHashSet;
class Solution {
public int[] solution(int n) {
LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
int i = 2;
while (n != 0 && i <= n) {
if (n % i == 0) {
primeNumbers.add(i);
n /= i;
} else {
i++;
}
}
return primeNumbers.stream().mapToInt(Integer::intValue).toArray();
}
}
다른 사람이 푼 코드를 보면 LinkedHashSet을 사용한다. 소수를 판별하는 if문에서 n /= i;을 사용하여 소인수분해 한다. 실제 어릴때 손으로 직접 소인수분해를 하는 원리와 같다.
새로배운점 :
LinkedHashSet은 중복된 값을 허용하지 않으며 순서를 유지하는 집합(Set) 자료구조이다.
만약 위 코드에서 마냥 arraylist를 사용했다면 i가 올라가면서 중복되고 순서도 뒤죽박죽의 i가 많이 add될것이다. LinkedHashSet을 사용함으로써 이런점을 방지한다.
Leave a comment