본문 바로가기

백준/C++

[Baekjoon/C++] 소인수분해 11653번

Baekjoon Online Judge 

문제로 이동

 

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

 

입력

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

 

출력

N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.

 


예제 입력 예제 출력
72 2
2
2
3
3
3 3
6 2
3
2 2
9991 97
103

풀이

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int N, num;
    cin >> N;

    // N이 10보다 같거나 크면 제곱근을 구한다.
    if (N < 10) 
        num = N;
    else
        num = sqrt(N);

    // 2부터 N 혹은 N의 제곱근까지의 숫자 중에서 소수를 찾는다.
    for (int i = 2; i <= num; i++) {
        for (int j = 2; j <= i; j++) {
            // 소수를 찾으면 출력
            if (j == i) {
                while (N % i == 0) {
                    N /= i;
                    printf("%d\n", i);
                }
            }
            else if (i % j == 0) break; // 소수는 자기자신과 1만으로만 나누어 떨어져야한다.
        }
    }

    // 제곱근보다 큰 소수 출력
    if(N != 1)
        printf("%d\n", N);

    return 0;
}

전의 포스트처럼 끝까지 for문을 돌리면 시간초과가 발생한다.

숫자 n을 36이라고 할때 이를 곱셈으로 표현할 수 있는 수는 (1, 36), (2, 18), (3, 12), (4, 9) , (6, 6)으로 36의 제곱근인 6까지의 숫자인 1, 2, 3, 4, 6을 찾으면 그 숫자들의 짝인 9, 12, 18, 36을 찾을 필요가 없어진다. 그러므로 위의 코드에서 제곱근을 사용하여 실행 시간을 줄였다.

'백준 > C++' 카테고리의 다른 글

[Baekjoon/C++] 베르트랑 공준 4948번  (0) 2022.04.09
[Baekjoon/C++] 소수 구하기 1929번  (0) 2022.04.08
[Baekjoon/C++] 소수 2581번  (0) 2022.04.08
[Baekjoon/C++] 소수 찾기 1978번  (0) 2022.04.08
[Baekjoon/C++] 큰 수 A+B 10757번  (0) 2022.04.08