백준/단계별

백준 2231 C#) 분해합

alpacadabra 2022. 5. 24. 02:33

각 자릿수를 더하는 문제는 빈번하게 출제되므로 꼭 익혀두는 것이 좋다.

 

public static class PS
{
    public static void Main()
    {
        string ns = Console.ReadLine();
        int n = int.Parse(ns);

        for (int m = n - ns.Length * 9; m < n; m++)
        {
            if (Sum(m) == n)
            {
                Console.Write(m);
                return;
            }
        }

        Console.Write(0);
    }

    private static int Sum(int n)
    {
        int sum = n;

        while (n > 0)
        {
            sum += n % 10;
            n /= 10;
        }

        return sum;
    }
}

 

이 문제를 풀다보면 문득 드는 생각이 하나 있다. 생성자의 범위를 어떻게 지정해야 하는가?

물론 그냥 풀어도 상관은 없다. 정답 처리는 되므로...

그러나 n의 범위가 [1, 1000000] 인데, 이를 1부터 계산하는건 상당히 찝찝한 일이 아닐 수 없다.

 

스스로 한번 생각해보자. 참고로 나는 n에서 n의 길이 * 9를 뺀 수부터 계산했다.

(개인차가 있겠지만 큰 의미는 없을 것이니 너무 깊게 생각하지는 말자)

 

아무튼, 각자 생각한 범위 내에서 생성자의 분해합을 계속 구하고 n이 나온다면 이를 출력하면 된다.

여기서는 Sum 메소드가 분해합을 계산해주고 있다.