Bakjoon Q11653 - C++

Q11653


Problem

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

Input

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

Output

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

예제 입력

1
72

예제 출력

1
2
3
4
5
2
2
2
3
3

나의 제출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <bits/stdc++.h>
using namespace std;

void division(int x);

int main(){
    int n;
    scanf("%d", &n);
    division(n);
    return 0;
 }

 void division(int x){
    if(x==1) // exit when input is 1 or end of recursion.
        exit(0);

    for(int i=2;i<=x;i++){
        if(x%i==0){//if divided by i
            x = x/i;
            printf("%d\n", i);
            division(x);
        }
    }
 }

추가 내용

recursion을 이용해서 구현하면 꽤 쉽게 풀리겠다고 생각을 했고, 실제로도 어렵지 않게 풀었던 것 같다. 먼저 소인수분해의 특성을 고려해서 약수를 떼어가고, 뗀 본체를 다시 원래 함수에다가 집어넣는 방식을 택했다.

  1. escape은 반복해서 나눈 결과 1만 남으면 exit(0)이다. 처음에 return으로 시도했는데 자꾸 깔끔하게 종료가 안되고 좀 추잡(?)하게 몇 번 더 반복하다가 끝난다.

  2. 2부터 나누기 시작하는데, if문을 통해서 나누어 떨어지는 경우에 나눈 수(인수)를 print하고 본체에서 그 수를 떼어내고 다시 함수에 넣는다(x = x/i). 안나눠진다면 i를 하나씩 올려가면서 나눠보는 것이고, 만약 자기 자신으로 나눌 때 까지 안나눠진다면(=소수) 자기 자신을 나눈 다음 1을 함수에 넣으므로 종료된다.

총평

처음 접했을 때는 살짝 골이 띵했는데 이정도면 할만 한듯 하다. 재귀함수를 이용하면 기분 좋을 정도로 깔끔하게 풀리는 문제.