본문 바로가기

알고리즘/백준

[Python] 백준 파이썬 2232 분해합

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

 

2231번: 분해합

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

www.acmicpc.net

# 백준 2231 분해합
n = input()

n_list = list(map(int, n)) #1

n_len = len(n_list) #2

generator_list = []

for i in range(10 * n_len): #3
  num = int(n) - i
  if num < 0 : #4
    break
  num_list = list(map(int, str(num))) #5
  create_num = num + sum(num_list) #6
  if create_num == int(n):
    generator_list.append(num)


if len(generator_list) == 0:
  print(0)
else:
  print(min(generator_list))

# 1 : 자릿수 분해를 위해 문자열로 받은 n을 리스트로 바꿔줍니다. 바꿔줄 때 리스트 안에 자료형을 정수로 하기 위해 map을 사용해줍니다.

# 2 : 자릿수가 몇개인지 저장합니다.

# 3 : 분해합 과정에서 모든 자릿수 합이 최대가 되는 경우는 전부 9인 경우이므로 원래 수에서 최소가 될 수 있는 값까지 빼주면서 반복해줍니다. 자릿수에 10을 곱한 이유는 모든 자릿수가 0~9까지 10개가 가능하고, 제일 첫 자릿수는 0이 안되기 때문에 10*n_len -1까지 반복하게 범위를 설정해줍니다.

# 4 : 반복 중에 0보다 작아지면 멈춥니다.

# 5 : 생성자 후보인 num의 자릿수를 분해 해줍니다. 처음과 같습니다.

# 6 : 생성자 후보의 분해합 결과를 create_num에 할당합니다. 그 후 처음 숫자와 일치하는지 확인하고 생성자 리스트에 추가해줍니다.

# 7 : 정답을 출력합니다.