출처 : 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; } }