jyamethyst21 님의 블로그

백준 2231번- '분해합' (PYTHON 풀이) 본문

CODING 💻

백준 2231번- '분해합' (PYTHON 풀이)

jyamethyst21 2025. 10. 5. 02:47

문제:

 

생성자를 구하는 문제이다. 예를 들어 198의 분해합은 198+1+9+8=216이다. 자기 자신+각 자릿수에 해당하는 값을 더하면 분해합이고 이를 다시 분해하게 되었을 때 가장 작은 수를 생성자라고 본다.

이번 문제의 챕터는 브루트포스이다. 해당 알고리즘은 모든 경우의 수를 다 시도하는 것을 의미하므로 이를 생각하면 조금 더 쉽게 풀 수 있다.

 

풀이:

n = int(input())

for i in range(1, n+1): 
    if i + sum(map(int, str(i))) == n:
        print(i) 
        break
else:
    print(0)

앞서 말했던 것처럼 모든 경우의 수를 전부 시도해서 가장 작은 생성자를 찾는 것이 핵심이다.

for문을 돌기 위해 1부터 분해합의 수까지 전부 더해볼건데 이때 자기자신+각 자릿수를 더해야하므로 if문과 같이 작성해야 한다.

이번 문제를 풀면서 str 함수 사용 시 문자열의 각 자리를 시퀀스 형태로 받을 수 있는 것을 처음 알았는데 알아놓으면 정말 유용하게 잘 쓸 것 같다. 아무튼 str을 활용해서 i 값을 쪼갤 수 있도록 만들고 이를 map을 통해 정수 형태로 다시 변환한다.

일반적으로, int로 값을 받으면 각 자리를 쪼갤 수 없는데 str은 가능하다. 이를 활용하는 것이다.

 

즉, str은 각 자리를 쪼개주는 역할을 하고 'map(int,' 은 문자열을 정수로 바꿔서 이를 다시 더할 수 있도록 해주는 역할을 한다.

예를 들어 216을 입력했다면 2,1,6으로 쪼개주는 역할이 str, 이를 정수형태로 바꿔주는 게 map의 역할이다.

 

만약, n이 11이고 map까지 실행한다면, 조건문은 우선 if i+sum(각 자릿수) == n: 이 된다. 루프를 돌다가 i가 10이 된다면, if 10+sum(1,0) == 11이 되고 이를 정리하면 if 10+1 == 11이 되어서 조건이 성립된다. 이때는 가장 작은 생성자를 찾은 것이므로 이를 출력한다. 그리고 그 외의 조건은 생성자가 없는 것으로 보고 0을 출력한다.

이렇게 풀면 문제를 풀 수 있다.