분해합

import sys


def main():
    input = sys.stdin.readline

    n = int(input())

    answer = solve(n)
    print(answer)


def solve(n: int) -> int:
    for i in range(1, n):
        if generate_from(i) == n:
            return i
    return 0


def generate_from(n: int) -> int:
    result = n
    while n > 0:
        result += n % 10
        n = n // 10
    return result


main()

$N$의 분해합은 $N$보다 항상 크므로, $N$의 생성자는 항상 $N$보다 작습니다. 따라서 $1$부터 $N - 1$까지의 수에 대해 분해합을 구해서 $N$이 되는 수를 찾으면 됩니다. $N \le 1\,000\,000$으로 작으므로 브루트 포스를 사용하여 문제를 해결할 수 있습니다.

Python에서 자연수의 각 자리수의 합을 구하려면 위 코드의 generate_from 함수처럼 10으로 나누어가며 계산하면 됩니다. 또는 다음과 같이 문자열로 바꾼 후 글자마다 값을 더하는 방법도 쓸 수 있습니다.

def generate_from(n: int) -> int:
    return n + sum(map(int, str(n)))

함수

함수(function)는 내부에 문장들을 가지고 있어, 인자들과 같이 호출하면 그 문장들을 실행하고 나서 값을 돌려줍니다.

Python에서 함수 정의는 다음과 같이 할 수 있습니다.

def 함수이름(인자1, 인자2):
    문장
    return 반환값

def 함수이름(인자1: 자료형, 인자2: 자료형) -> 반환자료형:
    문장
    return 반환값
  1. def를 사용하여 함수 정의를 시작합니다. 이 키워드는 define(정의하다)에서 왔습니다.
  2. 함수의 이름을 적습니다. 변수 이름과 규칙이 같습니다.
  3. 괄호 안에 함수가 입력으로 받을 인자들을 ,로 구분하여 적습니다.
  4. (선택사항) 인자 옆에 :을 적고 그 자료형을 표시해둘 수 있습니다. 실제로 프로그램이 실행될 때 검사하지는 않지만, IDE가 도움말을 띄우거나 오류를 감지할 때 도움을 줍니다.
  5. 인자들이 담긴 괄호를 닫습니다.
  6. (선택사항) ->를 적고 함수가 반환하는 값의 자료형을 표시해둘 수 있습니다. 역할은 위와 마찬가지입니다.
  7. :을 적고 다음 줄로 이동합니다.
  8. 함수가 호출될 때 실행할 문장들을 들여쓰기로 작성합니다. 관례적으로 들여쓰기에는 공백 4칸을 사용합니다.
  9. 함수 내부 문장들을 실행하다가 return을 만나면 그 뒤의 반환값을 반환하며 함수가 바로 종료됩니다. return을 만나지 않고 함수 내부 문장들의 끝에 이렀다면 None을 반환합니다.

함수 정의 과정에서는 함수 내부의 문장들이 실행되지 않습니다. 함수를 호출해야 실행됩니다. 따라서 다음 프로그램에서는 $2$가 출력된 다음 $1$이 출력됩니다.

def f1():
    print(1)

def f2():
    print(2)

f2()
f1()

물론 함수 내부에서 다른 함수를 호출하거나 자기 자신을 호출할 수도 있습니다.

댓글