본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 2231번: 분해합 C언어

문제 출처: https://www.acmicpc.net/problem/2231

 

2231번: 분해합

문제 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다. 자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그

www.acmicpc.net

1. 코드

#include <iostream>

using namespace std;

int share(int n, int sum);

int main(void)
{
    int n;
    cin >> n;
    
    for (int i = 1; i <= n; i++)
    {
        int sum = i;
        sum = share(i, sum);

        if (sum == n)
        {
            cout << i << endl;
            return 0;
        }
    }
    cout << 0 << endl;
    return 0;
}

int share(int n, int sum)
{
    sum += n % 10;
    n /= 10;

    if (n > 0)
        return share(n, sum);
    else
        return sum;
}

(실행)

2. 풀이 방식

1부터 n까지의 수들 중에서 분해합의 결과로 n이 나오는 생성자를 구하는 것이다. 다행이 입력의 수 범위도 작아서 어떠한 쉽게 해결할 수 있다.

다만 풀 때 10의 분해합은 5 + 5로 처리가 된다. 이전에 제출했던 코드가 있는데 해당 코드는 10의 생성자는 존재하지 않다고 나오게 했었는데 재채점된 이후로 10의 생성자가 5가 되도록 바뀐 것 같다.