Priceless

[백준] 2231번: 분해합 (C++) 본문

Algorithm & Test/백준

[백준] 2231번: 분해합 (C++)

Hyun__ 2023. 8. 9. 03:16

https://www.acmicpc.net/problem/2231

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

 

상진형의 도움을 많이 받은 문제

우선 생성자라는 개념을 이해해야 한다

각 자리의 숫자를 합하고 원래 숫자를 합해서 나온 수의 원래 숫자를 나온 수의 생성자라고 한다

예를 들어 245는 245+2+4+5=256 이므로 256의 생성자는 245이다. 

 

 

해당하는 숫자의 가장 작은 생성자를 찾아서 하므로 1부터 생성자를 찾을 때까지 브루트포스 알고리즘을 사용해야 한다

 

i는 생성자의 후보가 되고 z를 이용하여 생성자인지 여부를 판단한다. z를 10으로 계속 나누고 몫과 생성자를 합한 값을 temp에 저장한다.

합해진 수 temp가 입력 값인 n과 같다면 종료한다.

 

생성자가 없는 경우 0을 출력할 수  있도록 예외 처리를 잊으면 안된다.

예외 처리의 경우 cnt를 통해 for 문이 끝나도록 찾지 못했다면 0을 출력하도록 한다

 

#include<iostream>
#include<algorithm>

using namespace std;

// 빠른 입출력
void init(){
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(false);
}


int main(){
    init();
    
    int n;
    cin >> n;
    
    int z = 0;
    int cnt = 0;
    
    for(int i = 0; i < n ; i++) {
        z = i;
        int temp = 0;
        temp += z;
        
        while (z > 9){
            temp += z % 10;
            z = z / 10;
        }
        temp += z;
        
        if (temp == n){
            cnt++;
            cout << i;
            break;
        }
    }
    
    // 예외 처리
    if(cnt == 0){
        cout << 0 <<'\n';
    }

    return 0;
}