출처 : 4.4 지수시간 알고리즘 - 소인수 분해의 수행시간 (종만북)
코드설명
완전탐색을 활용합니다.
소인수 분해 문제에서는 입력으로 주어지는 숫자가 알고리즘의 동작에 직접적인 영향을 미치므로, 숫자가 특정 범위 안에 있다고 가정할 수 없습니다.
로직설명입니다.
- 2부터 시작하는 반복문을 통해 n을 가능한 모든 정수로 나누며, 나누어 떨어지는 경우(즉, n % div == 0인 경우) 해당 수(div)를 res 리스트에 추가하고, n을 div로 나눕니다. 이 과정을 n이 1보다 큰 동안 계속 반복합니다.
코드를 깔끔하게 if문 안에 n > 1 조건문을 넣어서 코드가 짧아졌다는 점이 흥미로웠습니다.
입력 예시 1
60
결과 예시 1
60
2 2 3 5
코드
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static int N, M;
public static int answer = 0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
ArrayList<Integer> arr = factor(N);
for(int value : arr) {
System.out.print(" "+value);
}
}
public static ArrayList<Integer> factor(int n){
if(n == 1) return new ArrayList<Integer>(Arrays.asList(1));
ArrayList<Integer> res = new ArrayList<Integer>();
for(int div = 2; n > 1;div++) {
while(n % div == 0) {
n /= div;
res.add(div);
}
}
return res;
}
}
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static int C, N, M;
public static int answer = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
for(int v : factor(N)) {
System.out.print(" "+ v);
}
}
public static ArrayList<Integer> factor(int n){
//기저사례 0 : n이 1일경우 중단.
if(n == 1) return new ArrayList<Integer>(Arrays.asList(1));
//기저사례 1 : 만약 n이 1 이하 일겨우 중단.
if(n < 1) return new ArrayList<Integer>(Arrays.asList(n));
ArrayList<Integer> res = new ArrayList<Integer>();
for(int div = 2; n > 1; div++) {
while(n%div == 0) {
n /= div;
res.add(div);
}
}
return res;
}
}