[BOJ] 2231
분해합
2231번 https://www.acmicpc.net/problem/2231
분류
- 
    
Bronze 2
 - 
    
브루트포스 알고리즘
 
해법
백만이 입력으로 들어왔을 때 시간적 손해가 크므로
1부터 1,000,000까지를 모두 백만의 생성자인지 확인할 수는 없습니다.
따라서, 확인할 범위를 정하는 것이 가장 중요합니다.
4자리 수인 n이 있다면 n의 생성자는 n - 9 * 4 보다 작아질 수 없음을 활용하시면 됩니다.
정답 코드
#include <iostream>
using namespace std;
int DigitCnt(int n) // cal digits
{
    int cnt = 0;
    while ( n > 0 )
    {
        n /= 10;
        cnt++;
    }
    return cnt;
}
int DigitSum(int n) // add all digits
{
    int sum = 0;
    int m = 10;
    while ( n > 0 )
    {
        int add = n % m;
        sum += add;
        n /= m;
    }
    return sum;
}
int Constructor(int n)
{
    int start = n - DigitCnt(n) * 9; // constructor of n can't be smaller than n - DigitCnt(n) * 9
    int dest = n - 1; // also can't be bigger than n - 1
    for (int i = start; i <= dest; i++)
    {
        int result = i + DigitSum(i);
        if (result == n)
            return i;
    }
    return 0;
}
int main(void)
{
    int n;
    cin >> n;
    cout << Constructor(n);
    return 0;
}
Leave a comment