문제
어떤 자연수 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을 출력한다.
만약! 216을 입력했다면,
216의 생성자인 198과 207중 작은 값인 198이 출력되어야 한다.
# 198와 207이 왜 216의 생성자냐구?
[ 198 ] + 8 + 9 + 1 = 216 O
[ 207 ] + 7 + 0 + 2 = 216 O
[ 202 ] + 2 + 0 + 2 = 206 X
따라서 괄호친 부분은 생성자 후보가 되는 것이고,
생성자후보와 생성자후보의 요소들을 더한 값이 최종값과 같아지면,
최종값의 생성자는 괄호친 부분이 되는 것이다!
다음은, 본인의 소스코드이다.
----------------------------------
n=int(input()) # 생성자를 알아낼 최종값을 입력받는다.
total=0 # 생성자를 알아내기 위한 후보값. 생성자후보와 생성자후보 요소들을 더한 값. 이 값과 최종값 n이 같아지면 최종값 n의 생성자이다.
answer=0 # 출력할 정답
for i in range (10,n): # 10부터 for문을 돌릴 것이다. 0~9는 생성자가 존재할 수 없다. * 1은 1+1=2, 2는 2+2=4 . . .
num=i # 현재 i의 값을 num으로 넣어준다.
total=num # [ ??? ] + ? + ? + ? 에서 [ ??? ] 부분.
if answer: # 만약 answer에 값이 있다면 True가 된다.
break # 값이 있으면 for문을 나간다.
while True:
if num//10==0: # ex) 198//10 = 8이되고, 19//10 = 9가 되며, 9//10 = 0이 된다. 따라서 0이 될때의 num값은 그냥 더해주면 됨.
total+=num
if total==n: # 만약, 최종값과 생성자후보와 생성자후보 요소를 더한 값이 같아진다면.
answer=i
break # while문 나간다.
else: # num//10 == 0이 아니라면,
total+=num%10 # ex) 198 += (198%10 = 8) 즉, 198+8 = 206
num=num//10 # ex) 198의 마지막 자리를 없애줌. 198//10 = 19
print(answer)
결과는 성공 !
'알고리즘SOLUTION > 브루트포스' 카테고리의 다른 글
백준 7568 덩치 파이썬 부셔보자 ! (0) | 2020.10.13 |
---|