코딩테스트/백준

[Python] 백준 2231. 분해합

jungmin.park 2023. 11. 23. 10:06

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

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

문제 설명:

216이 주어졌을때 198 -> 198 + 1 + 9 + 8 로 216을 만들 수 있다.

이 역시 1부터 216이 될 때까지 계속 for문을 돌면서 찾아 볼 수 있다.

 

문제 설계

  • 루프를 돌면서 i가 10 이상이면 몫과 나머지를 구해 각 자릿수의 합을 구한다. 
    • ex) 23 일때 2+3을 구한다.
  • 만약 각 자릿수의 합과 입력받은 N의 값이 같으면 종료한다.

 

import sys

input = sys.stdin.readline
n = int(input())
result = 0
for i in range(1, n+1):
    cons = 0
    #루프를 돌면서 i가 10 이상이면 
    if i >= 10:
        num = i
        # 몫과 나머지를 구해 각 자릿수의 합을 구한다.
        while num > 10:
            cons += num % 10
            num = num // 10
        cons += num
        
	# 만약 각 자릿수의 합과 i의 합이 입력받은 N의 값이 같으면 종료한다.
    if (i + cons) == n:
        result = i
        break

print(result)

 

하지만

 

백준은 틀린이유를 알려주지 않아 난감하다. 다만 코드 중 신경쓰이는 부분은

#루프를 돌면서 i가 10 이상이면 
    if i >= 10:
        num = i
        # 몫과 나머지를 구해 각 자릿수의 합을 구한다.
        while num > 10:
            cons += num % 10
            num = num // 10
        cons += num

이 부분을 더 간단히 해볼 수 있을거 같았다.

 

10이상이 아닌 몫이 0이면 루프를 나오는 방식으로 바꾸었다.

    while num != 0:
        sum += num % 10
        num = num // 10

 

 

 

import sys

input = sys.stdin.readline
n = int(input())
result = 0
for i in range(1, n+1):
    num = i;
    sum = 0
    #각 자릿수의 합을 구한다.
    while num != 0:
        sum += num % 10
        num = num // 10

    if (i + sum) == n:
        result = i
        break

print(result)

 

 

저 부분에 문제가 있었던 것 같다.