알고리즘SOLUTION/브루트포스

백준 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을 출력한다.

 

 

 

 

만약! 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