백준 문제풀이

[beakjoon-2231-C++] 분해합

박여치 2023. 1. 17. 14:44

문제

어떤 자연수 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을 출력한다.

코드

이 문제에서 우리가 필요한 부분은 각 자리 수의 합을 구하는 부분과 생성자를 찾는 부분이다.

N의 범위가 1~1000000이니 자연수 N을 1000000부터 범위를 줄여가며 나누어서 몫을 더하면 자릿수의 합을 구할 수 있다.

자릿수의 합을 구하면 생성자를 찾기는 쉬워진다.

1~N까지의 모든 숫자 중 작은 것부터 숫자와 자릿수의 합이 N과 같은 숫자를 찾아낸다.

작은 숫자부터 시작하는 이유는 생성자의 최솟값을 찾는 문제이기에 처음 발견한 생성자가 이 문제의 해답이 되어 실행 시간을 단축할 수 있기 때문이다.

 

다른 사람의 풀이

https://www.acmicpc.net/source/44926587

범위에서 최대로 가능한 자릿수의 합이 54인 것을 이용해 생성자를 찾는 범위를 줄인 것이 인상깊었다.

삼항 연산자를 활용하여 수의 범위와 코드의 수를 줄인 것도 볼 수 있다.

특히 for문에서 삼항연산자를 통해 조건을 만족시킬 경우 for문이 종료되게끔 한 것이 보였다.

break문을 사용하지 않고도 for문을 벗어날 수 있는 방법을 배울 수 있었다.