Post

12. Python(분해합)

12. Python(분해합)

[toc]

분해합

문제

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

제출

코드1

1
2
3
4
5
6
7
8
9
10
n = int(input())

for i in range(1, n+1):
    a = sum(map(int, str(i)))
    a_sum = i + a
    if a_sum == n:
        print(i)
        break
    elif i == n:
        print(0)

코드2

1
2
3
4
5
6
7
8
9
10
11
def find_smallest_constructor(n):
    for i in range(1, n + 1):
        a = sum(map(int, str(i)))
        a_sum = i + a
        if a_sum == n:
            return i 
    return 0

n = int(input())
result = find_smallest_constructor(n)
print(result)
1
2
# 입력
216
1
2
# 출력
198

인사이트

  1. 문제의 예시와 같이 245의 분해합은 256(245 + 2 + 4 + 5)으로 정의될 수 있음. 즉, 245는 256의 생성자가 됨

  2. 자연수 a를 자릿 수 별로 나눠서 더한 값이 자연수 n과 같을 때, 자연수 a는 자연수 n의 생성자가 됨

조건

  • 문제에서 요구하는 조건은 자연수 n의 가장 작은 생성자를 구하는 것

풀이

1. 반복문을 통한 생성자 판별

  • for i in range(1, n + 1) 구문을 사용하여 1부터 n 까지 모든 수를 순회

  • 각 i 에 대해 자릿수를 분해하고 그 합을 계산합니다. 이때 sum(map(int, str(i)))를 통해 i 의 자릿수를 각각 더할 수 있음

    • EX1)

      • i == 13

      • a = 1 + 3

      • a = 4

2. 생성자 판별

  • i 와 자릿수 합을 더하여 a_sum을 구함
  • EX2)
    • i == 198
    • a = 1 + 9 + 8
    • a_sum = 198 + 18
    • a_sum == 216

3. 결과 출력

  • 만약 생성자가 존재하지 않으면 0을 반환
  • 결과를 출력하여 최종적으로 n 의 생성자를 확인

  • a_sum의 값이 n과 같을 때, i는 n의 최소 생성자가 됨