[programmers] 소인수분해 - Java
소인수분해 문제에서는 주어진 자연수 'n'의 소인수를 오름차순으로 배열에 담아 반환하는 함수를 작성해야 합니다. 이를 위해 먼저 2의 배수인지 확인하고, 그 다음 3부터 n의 제곱근까지의 홀수 중 약수가 있는지 확인합니다. 만약 약수가 없다면 해당 수는 소수입니다. 이 문제를 통해 효율적이고 가독성 좋은 코드 작성의 중요성을 알 수 있습니다.
Jan 29, 2024
문제 설명
소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 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합니다.
solution.java
import java.util.*; class Solution { public int[] solution(int n) { List<Integer> list = new ArrayList<>(); // 2의 배수인지 확인 while (n % 2 == 0) { if (!list.contains(2)) { list.add(2); } n /= 2; } // 3부터 n의 제곱근까지의 홀수 중 약수가 있는지 확인 for (int i = 3; i <= Math.sqrt(n); i += 2) { while (n % i == 0) { if (!list.contains(i)) { list.add(i); } n /= i; } } // 홀수와 짝수 중 약수가 없다면 소수 if (n > 2) { list.add(n); } return list.stream().mapToInt(e -> e).toArray(); } }
핵심 키워드
- 처음 시도했던 방식은 n을 2부터 n까지 1식 증가시키며 나머지를 계산하는 코드를 작성했다.
- 해당 방식은 값을 구할 수는 있었지만 실행 시간이 10초를 넘어 효율적인 코드라고 생각하지 않았다.
- 수정한 코드는 먼저 2의 배수인지 확인을 한 다음, 3부터 2씩 증가시킨 값을 나머지 연산해서 약수가 있는지 판단하였다.
- 또한 반복문의 범위가 n까지가 아닌 n의 제곱근까지로 설정하였는데, n을 제곱근보다 큰 수로 나눌 수 있는 경우, 다른 인수는 이미 찾은 제곱근보다 작을 것이기 때문이다.
결론!
해당 문제를 풀면서 코드를 작성하다가 효율적인 코드를 작성하는 방식과 가독성이 좋은 코드를 작성하는 것의 중요함을 알 수 있었다.
Share article