
처음 풀이
package BOJ.step9;
import java.util.Scanner;
public class BOJ11653 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
for (int i = 2; i <= N; i++) {
while (N % i == 0) {
System.out.println(i);
N = N / i;
}
}
}
}
코드의 실행 시간이 오래 걸리는 이유는 불필요하게 큰 숫자까지 반복문을 실행하기 때문이다. 이를 개선하는 방법을 설명하겠다.
BOJ11653(소인수분해) 문제에서는 자연수 ( N )을 소인수분해하여 출력해야 한다.
현재 코드의 비효율적인 부분:
for 루프가 i = 2부터 N까지 모든 수를 검사한다.package BOJ.step9;
import java.util.Scanner;
public class BOJ11653 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
// 2부터 sqrt(N)까지 확인
for (int i = 2; i * i <= N; i++) {
while (N % i == 0) {
System.out.println(i);
N /= i; // N을 i로 나누어 갱신
}
}
// 남은 수가 1보다 크다면 그 자체가 소수이므로 출력
if (N > 1) {
System.out.println(N);
}
sc.close();
}
}
💡 모든 약수는 "짝"을 이루고 있다!
예를 들어 36의 약수를 생각해보자.
✅ 제곱근(6)까지만 찾으면, 나머지는 자동으로 구할 수 있다!
약수를 구할 때 작은 숫자로 먼저 나누면, 자동으로 큰 숫자도 구할 수 있다!
예를 들어, 36을 나누는 과정:
💡 이미 작은 숫자로 나누면서 큰 숫자도 자동으로 구해진다!
💡 그래서 제곱근까지만 검사해도 충분하다! 🚀
✅ 제곱근(10)까지만 보면, 나머지는 자동으로 따라온다!