
내가 생각했을때 문제에서 원하는부분
소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다.
예를 들어 12를 소인수 분해하면 2 * 2 * 3 으로 나타낼 수 있습니다.
따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
내가 이 문제를 보고 생각해본 부분
int[] testCases = {12, 17, 420};
프로그래머스 입출력 예시에 제시된 세 가지 테스트 값을 배열에 미리 담아둔다.
for (int n : testCases)
반복문을 사용해 배열 안의 숫자를 하나씩 꺼내고, 이를 solution 메서드에 매개변수로 전달한다.
System.out.println(Arrays.toString(result));
solution 메서드가 반환한 결과 배열을 콘솔에 가독성이 좋은 형태([값, 값])로 출력한다.
List<Integer> list = new ArrayList<>();
소인수의 개수가 정해져 있지 않기 때문에 크기가 유동적으로 조절되는 가변 리스트를 선언한다.
for (int i = 2; i <= n; i++)
2부터 시작하여 n까지의 자연수로 나누어보며 소인수를 찾는다.
별도의 소수 판별 로직이 필요 없는 이유는 2부터 차례대로 나누어가면 4나 6 같은 합성수는 이미 작은 소수들에 의해 먼저 걸러지기 때문이다.
if (n % i == 0)
n을 i로 나누었을 때 나머지가 0이라면 i는 n의 소인수이다. 따라서 list.add(i)를 통해 리스트에 추가한다.
while (n % i == 0) { n /= i; }
n이 더 이상 i로 나누어떨어지지 않을 때까지 계속 나누어 값을 줄인다. 이 과정을 통해 중복된 소인수가 리스트에 여러 번 쌓이는 것을 방지한다.
return list.stream().mapToInt(i -> i).toArray();
지금까지 모은 리스트를 자바 스트림(Stream) API를 활용해 기본형 정수 배열(int[])로 변환한 뒤 반환한다.
코드로 구현
import java.util.ArrayList;
import java.util.List;
class Solution {
public int[] solution(int n) {
List<Integer> list = new ArrayList<>();
for (int i = 2; i <= n; i++) {
if (n % i == 0) {
list.add(i);
while (n % i == 0) {
n /= i;
}
}
}
return list.stream().mapToInt(i -> i).toArray();
}
}
프로그래머스 코드
package programmers.programmers2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
// 프로그래머스 소인수분해
public class Main165 {
public static void main(String[] args) {
// 입출력 예시에 있는 모든 값들을 배열에 담아둡니다.
int[] testCases = {12, 17, 420};
// 반복문을 돌며 각각의 입력값에 대한 소인수분해 결과를 확인합니다.
for (int n : testCases) {
int[] result = solution(n);
System.out.println(Arrays.toString(result));
}
}
public static int[] solution(int n) {
List<Integer> list = new ArrayList<>();
for (int i = 2; i <= n; i++) {
if (n % i == 0) {
list.add(i);
while (n % i == 0) {
n /= i;
}
}
}
return list.stream().mapToInt(i -> i).toArray();
}
}
위에 있는 코드를 변경한 코드
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.