#BOJ 2231 분해합
n = int(input())
for i in range(1, n+1):
tmp = list(map(int, str(i)))
result = i + sum(tmp)
if result == n:
print(i)
break
if i == n:
print(0)
코드 설명
각 자리 숫자의 합을 어떻게 구할까?
해당 문제를 풀면서 가장 어려웠던 부분은 각 자리 숫자의 합을 어떻게 구하는지였다. 몇자리 숫자인지 알면 나눗셈 연산자(/
)와 나머지 연산자(%
)를 이용하여 구할 수 있지만, 위 문제의 경우에는 n이 몇자리 숫자인지 알 수 없었기 때문이다.
💡 그렇다면 n을 문자로 바꿔서 리스트에 넣어보자!
그래서 고안한 방법은 숫자를 문자로 바꾼 다음 리스트에 넣는 방식이다.
tmp = list(map(int, str(i)))
위와 같이 임시 리스트 tmp
에 숫자 i
를 문자열로 바꾼 다음, int
형으로 맵핑시켜서 리스트에 넣어준다. 그러면 sum()
함수를 이용하여 각 자리 숫자의 합을 손쉽게 구할 수 있다.
분해합 result
가 n
과 같다면 해당 숫자가 n의 생성자이므로 해당 숫자를 출력하고 반복문을 빠져나간다. 이때, for문을 1부터 하나씩 더해가며 반복하였기 때문에 처음 나온 생성자가 곧 가장 작은 생성자이다.
만약 숫자i
가 n과 같아진다면 생성자를 찾지 못한 것이므로 0을 출력한다.