Skip to content

[백준] 2231. 분해합

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

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하라.


브루트포스 알고리즘에 해당하는 문제인데, 아래와 같이 생성자를 찾는 로직만 작성하면 쉽게 풀어낼 수 있다.

n = int(input())
a = [i for i in range(1, n + 1) if i + sum(int(x) for x in str(i)) == n]
print(a[0] if a else 0)

아래 방법의 로직이 연산이 더 적은 대신에 for loop을 사용해서 연산 속도가 느린데, BOJ의 테스트 결과로는 성능 차이가 별로 나지 않는다고 나온다.

n, a = int(input()), 0
for i in range(1, n + 1):
    if i + sum(int(x) for x in str(i)) == n:
        a = i
        break
print(a)

Reference