분해합 
문제
어떤 자연수 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을 출력한다.
예제 입력 1
216
예제 출력 1
198
처음에 문제를 이해하는 것이 어려웠습니다. 위 말은 즉 xyz라는 값을 주면 abc라는 하나의 값과 각 자리의 숫자 a,b,c 를 더한 값, abc+a+b+c = xyz인 abc를 출력하라는 말입니다
쉬운 알고리즘 접근이 있을 까 고민을 해봤지만 완전탐색(브루트포스)로 푸는 것 말고는 떠오르지 않았습니다
브루트포스는 전부 돌면서 찾아낸다는 의미를 갖습니다. 생성자가 있을 경우 가장 작은 것을 구하려면 1부터 시작하면서 돌면서 찾아서 끝내면 되지 않을까라는 생각에서부터 접근했습니다
m = int(input())
answer = []
for i in range(1, m):
t = list(str(i)) #숫자를 문자로 변환하여 자릿수 parsing
t = [*map(int, t)] #각 자릿수에 대하여 숫자로 변환
p = sum(t) # 각 자릿수 총합
if (i + p) == m:
print(i)
break
else:
print(0)
for - else라는 구문이 파이썬에는 존재합니다. if-else문은 많이 봐왔지만 for-else문은 생소할 수 있습니다
for else문은 for문을 중간에 break로 나가는 것이 없이 완전히 다 순회하였을 경우에만 else 구문에 값을 해결한다로 보면 될 것 같습니다
마치 try-catch 구문이 있을 때 catch되는 에러가 없다면 그 아래로 코드들 진행을 하듯 말입니다
그래서 만약 for문에서 생성자를 찾으면 break로 나오지만 그렇지 못한 경우에는 결국 다 순회를 하고나서 else 구문에 들어가서 0을 출력해줍니다. 위 문제에서 생성자가 없을 경우 0을 출력하라는 의도대로 나타냈습니다
'알고리즘 > 문제풀이' 카테고리의 다른 글
백준 11866번 요세푸스0 문제 - Python (0) | 2023.02.19 |
---|---|
백준 11650번 좌표 정렬하기 - Python (0) | 2023.02.19 |
백준 10828번 스택 - Python (0) | 2023.02.19 |
백준 4153번 직각삼각형 - Python (0) | 2023.02.17 |
백준 1929번 소수 구하기 - Python (0) | 2023.02.16 |