알고리즘 & 코딩테스트

[백준] 2231번 분해합

Haksae 2022. 3. 20. 04:06

⛏ 문제 파악

  • 가장 작은 생성자를 구하는 문제 (분해합의 생성)
  • 브루트 포스 방식으로 풀면 된다.

👉🏻  답안

N = int(input())
number = 1

while True:
  if N < number :
    number = 0
    break
  temp = 0
  for i in range(len(str(number))):
    temp += int(str(number)[i])
  if number + temp == N:
    break
  number += 1

print(number)

📑  간단한 설명

  • 자기 전에 빨리 풀려고 그냥 글을 코드로 바로 적어서.. while을 돌리고 안에 for문을 넣어서 진짜 브루트 포스 방식으로 풀었다.
  • 다만 너무 비효율적인 것 같아서 다른 답안들을 보니, 생각해보니 굳이 while을 왜 썼지 내가 라는 생각을 했다..
  • 좀 더 생각하고 쓰자... :)

👉🏻  다른 분의 답안

n = int(input())  # 분해합을 입력값으로 받음

for i in range(1, n+1):   # 해당 분해합의 생성자 찾기
    num = sum((map(int, str(i))))  # i의 각 자릿수를 더함
    num_sum = i + num  # 분해합 = 생성자 + 각 자릿수의 합
    # i가 작은 수부터 차례로 들어가므로 처음으로 분해합과 입력값이 같을때가 가장 작은 생성자를 가짐
    if num_sum == n:
        print(i)
        break
    if i == n:  # 생성자 i와 입력값이 같다는 것은 생성자가 없다는 뜻
        print(0)