백준
2231:분해합
rabbit-jun
2026. 1. 15. 16:41
링크:https://www.acmicpc.net/problem/2231
문제
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.
자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
출력
첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.
import sys
input = sys.stdin.readline
n = int(input())
p= 0
for i in range(1, n+1):
q= i
r=0
while q != 0:
r +=q%10
q= q//10
if (i + r) == n:
print(i)
p=1
break
if p ==0:
print(0)
- 먼저 분해합을 이해해야 한다, ex) 37 = 32 +3+2 이라면 32가 37의 생성자
쉽게 분해해서 합해진 아이 = 분해합, 그 분해합을 생성하는 아이 = 생성자 - 10진수 ,즉 10으로 나누었을 때 나머지들이 각 자리수의 값이다 ex) 32의 3 , 2
- 10진수를 구하는 알고리즘에서 나머지를 합하게 만든다
- 1부터 n+1까지 올라가니 자연스럽게 맨 처음 출력되는게 최소값이다
- 만약 생성자가 없을 경우, 즉 ip문이 동작하지 않으면 0을 출력한다

다른 사람의 풀이
N=int(input())
p=max(1,N-54)
number = 0
for i in range(p,N):
s=i+sum(map(int,str(i)))
if s==N:
number = i
break
print(number)
- 분해합의 범위가
첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)로 명시 되어 있다. - 즉 생성자는 아무리 커봤자 999999가 최대일 것이다 -> 최대값이 더 작을 수도 있지만 간단하게 생각하면 6자리 모두가 999999를 넘기는 값은 생성자에서 나오지 않을 것이다
- 분해합 = 생성자 +(각 자리수의 합) -> 생성자 =분해합 - 각 자리수의 합 이므로 분해합 - 54 가 생성자가 존재 할 최소 시작 지점이다 (단, p는 자연수여야 하므로 max()를 써줘서 분해합 - 54가 음수 일 경우 1부터 시작하게 설정)
- 문자열에 각 int를 해서 자리수로 분해한 후 현재의 값과 더한다. ex) i= 245 -> '245' -> 2,4,5 로 만든 후 245+2+4+5
- 만약 if문이 한번도 발생 안하면 0이 발생 했다면 해당하는 값이 출력될 것이다.
후기
백준 문제들이 갈수록 먼저 생각하거나 따로 생각해서 푸는게 더 쉬워지는 경향이 있는 것 같다.
이제는 한번에 못 풀겠다. (몸 상태가 안좋아서 그런가...)
반응형