본문 바로가기
Development/Baekjoon

[C#] 2231번: 분해합

by Mobics 2025. 10. 7.

목차


    백준 단계별로 풀어보기

    25.10.07

    12단계: 브루트 포스


    2231번: 분해합

    문제 링크 : https://www.acmicpc.net/problem/2231

     

    문제 풀이

    >> 문제를 풀기 위해 알아야 할 개념

    - 분해합과 생성자

    : 어떤 자연수 M이 있을 때, 그 자연수 M의 분해합 N은 M과 M을 이루는 각 자리수의 합을 의미한다. 이때 M은 N의 생성자이다.

    --> 생성자가 없는 자연수도 있고 반대로 생성자가 여러 개인 자연수도 있다. 예를 들어 20은 생성자가 없으며, 216은 198과 207의 생성자를 갖는다.

     

    >> 풀이

    1. 생성자를 찾을 값을 입력 받아 int값으로 변환하고 결과로 출력할 값을 변수로 선언한다.
    2. for 반복문을 통해 1부터 '입력값 - 1'까지 아래 과정을 반복하며 모든 경우의 수를 테스트한다.
      •     i 값의 분해합을 담을 변수 sum과 i 값을 임시로 담을 변수 temp를 선언하고, i 값으로 초기화한다.
      •     temp 값이 0이 아닐 때까지 while 문을 반복하며 sumtemp의 1의 자릿수를 더하고 temp를 10으로 나눈 몫을 다시 temp에 대입한다. 즉, temp 값의 1의 자리부터 순서대로 각 자리수를 sum에 더해서 i 값의 분해합을 찾아준다.
    3. 만약 i 값의 분해합이 입력값과 같다면 i가 입력값의 가장 작은 생성자이므로, 출력할 결과값에 i 값을 대입하고 for 반복문을 break 한다. --> 만약 생성자를 찾지 못했다면 자연스럽게 출력할 결과값은 처음 초기화한 "0"이 된다.
    4. 결과값을 출력한다.

     

    정답 코드

    class Backjoon
    {
        static void Main(string[] args)
        {
            int number = int.Parse(Console.ReadLine());
            int result = 0;
    
            for (int i = 1; i < number; i++)
            {
                int sum = i;
                int temp = i;
    
                while (temp != 0)
                {
                    sum += temp % 10;
                    temp /= 10;
                }
    
                if (sum == number)
                {
                    result = i;
                    break;
                }
            }
            Console.Write(result);
        }
    }