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