본문 바로가기

SWLUG/파이썬 (코딩테스트)

[파이썬/백준] 2231번 분해합

 2231번 분해합

 

https://www.acmicpc.net/problem/2231

 

 

 

 

 

문제 확인

 

 

 

예제

# 입력
216

# 출력
198

 

 

문제 분석

 

자연수 N의 가장 작은 생성자 구하기 (없는 경우/ 여러 개의 경우도 존재) 

- 없으면 0 출

자연수 N = N과 N을 이루는 각 자리수의 합 
(ex. 256 = 245 + 2 + 4 + 5 )

 

 

1부터 입력받은 n까지 for문을 통해 분해합을 구해보고 그 합이 n과 같다면 출력 후 break해준다.

같지 않을 시, 분해합이 없는 경우로 간주하여 0 출력하고 다음 반복을 진행한다. 

 

 

분해합을 구하는 알고리즘이 관건인 것 같은데...! 

범위 내의 모든 수에 접근하기 위해 반복 변수인 i를 이용해준다.

 

i의 각 자리수를 우선 다 더해서 위의 예시에서는 (2 + 4 + 5) 와 같은 값을 구해준다. = ndigit

어차피 분해합은 각 자리수를 연결한 값이 생성자이므로 ndigit + i 를 연산하여 nsum에 저장해준다.

 

이 분해합 구하는 걸 n의 범위 내에서 반복하면 된다.

 

 

n = int(input())

for i in range(1, n+1):
    ndigit = sum((map(int, str(i))))
    nsum = ndigit + i
    if nsum == n:
        print(i)
        break
    if i == n:
        print(0)