[Python] 백준 알고리즘 온라인 저지 2231번 분해합
https://www.acmicpc.net/problem/2231
난이도는 쉬운 편으로 예외의 경우를 어떻게 처리해야 할지를 제외하면 어렵지 않게 for문과 리스트 내장 함수로 풀 수 있었다.
코드
n = int(input())
result = 0
for i in range(1, n+1):
nums = list(map(int, str(i)))
result = sum(nums) + i
if result == n:
print(i)
break
if i == n:
print(0)
의사 코드
1. 입력 값(n) 받기
2. 결과를 담을 변수를 생성(result)
3. for문으로 1부터 n까지 모든 수를 계산해보며 분해합을 구한다.
4. 제일 먼저 계산된 값을 출력한다. 없을 때는 0을 출력
분해합
이번 문제 역시 브루트 포스 방식으로 분해합을 구하는 문제였다. (브루트 포스에 관해서는 2798번 블랙잭 문제에서 간단하게 정리해 놓았습니다.) 여기서 분해합이란 어떠한 수 A는 B라는 수와 B의 각 자리 수의 합이 A일 때를 말한다.
예를 들면 216 = 198 + 1 + 9 + 8 즉 198이 216의 가장 작은 분해합이다. 여기서 B는 A와 같을 수 없다는 것을 알 수 있다.
풀이
입력과 빈 변수를 하나 만든 뒤 분해합에 해당하는 숫자를 찾기 위해서는 1부터 입력 값까지의 모든 수를 더해야 찾을 수 있다. (처음 코드를 작성할 때는 0부터 시작했는데 오답으로 표시됐었다.😅)
브루트 포스를 위한 for문을 작성한 뒤 i값을 각 자릿수로 슬라이싱하여 리스트로 만드는 함수를 검색하였다.
또 다른 for문을 이용하여 리스트(nums)의 모든 값을 더할 수 있지만 다행히도 sum()이라는 내장 함수가 떠올라 result라는 빈 변수에 sum(nums) + i를 선언하여 i라는 수와 i의 각 자릿수의 합을 더한다.
여기서 문제에서 제일 작은 수를 출력하라는 조건을 위해 가장 작은 수를 출력한 뒤 for문을 break로 빠져나오게 하여 시간을 조금 단축시켰다. 이 조건을 걸지 않는다면 또 다른 분해합을 출력하게 될 것이다.
예외 처리에서 조금 시간을 소요하였는데 단순하게 i가 분해합을 찾지 못하고 n까지 가게 된다면 분해합이 없는 것이므로 0을 출력하여 문제를 풀었다.
풀이 결과
'알고리즘' 카테고리의 다른 글
백준 1018번 체스판 다시 칠하기 파이썬 풀이 (0) | 2022.01.13 |
---|---|
백준 7568번 덩치 파이썬 풀이 (0) | 2022.01.10 |
백준 2798번 블랙잭 파이썬 풀이 (0) | 2022.01.07 |
백준 11729 하노이 탑 이동 순서 파이썬 풀이 (0) | 2022.01.04 |
백준 2247번 별찍기 - 10 파이썬 풀이 (0) | 2022.01.03 |