solved_ac[Class2][분해합](https://www.acmicpc.net/problem/2231)
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.
자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.
첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.
216
198
브루트 포스 문제로 가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족되는 결과만을 가져온다.
생성자를 찾기 위해서 for문을 1부터 입력 받은 수 만큼 돌리는데 가장 작은 생성자를 구해내야 하기 때문에 찾게 되면 break를 걸어서 빠져나온다.
brute: 무식한
force: 힘
무식한 힘으로 해석할 수 있다.
완전탐색 알고리즘. 즉, 가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족되는 결과만을 가져온다.
이 알고리즘의 강력한 점은 예외 없이 100%의 확률로 정답만을 출력한다.
일반적 방법으로 문제를 해결하기 위해서는 모든 자료를 탐색해야 하기 때문에 특정한 구조를 전체적으로 탐색할 수 있는 방법을 필요로 한다.
알고리즘 설계의 가장 기본적인 접근 방법은 해가 존재할 것으로 예상되는 모든 영역을 전체 탐색하는 방법이다.
선형 구조를 전체적으로 탐색하는 순차 탐색, 비선형 구조를 전체적으로 탐색하는 깊이 우선 탐색(DFS, Depth First Search)과 너비 우선 탐색(BFS, breadth first search)이 가장 기본적인 도구이다.
*너비 우선 탐색은 브루트 포스와 관련이 깊고, 깊이 우선 탐색은 다음에 작성될 백트래킹과 관련이 깊으므로 그때 따로 작성하도록 하겠다.
자연수 입력 받음
1인 경우 생성자가 없기 때문에 예외처리
2부터 입력받은 수 n까지 for 문을 돌린다
그 안에 반복문을 하나 더 만들어서 for 문의 index인 i 를 j에 넣어준 후 2중 반복문이 돌 때마다 j의 나머지 값을 sum에 더해준 후 j를 10으로 나눈 몫으로 업데이트 시켜준다 (각 자리수를 더해주기 위한 작업)
10으로 계속 나눠서 몫이 0이 되면 2중 반복문을 빠져나온다
각 자리수를 더한 후 자기 자신도 더해야 되기 때문에 for문의 index인 i를 더해준다.
입력 받은 수 n과 같으면 index인 i값을 출력해주고 빠져나온다.
i가 입력 받은 수 - 1 까지 검사를 했는데도 생성자를 찾지 못한다면 생성자가 없는 것이기 때문에 0을 출력해준다
정답을 찾은 것도 아니고 for문을 다 돈 것도 아니면 sum 을 0으로 업데이트 시켜주고 다시 돌려준다.
import sys
n = int(sys.stdin.readline())
sum = 0
j = 0
if n == 1:
print("0")
else:
for i in range(2, n):
j = i
while True:
sum += j % 10
j = j // 10
if j == 0:
break
sum += i
if sum == n:
print(i)
break
elif i == n - 1:
print("0")
else:
sum = 0