[백준] 2231번 - 분해합 C++

문제
어떤 자연수 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. 수를 입력받고 for문으로 해당 수까지 반복하도록 반복문을 설정한다.
  2. 점차 증가하는 i값을 통해 부르트 포스 방식으로 i값과 해당 i값의 자릿수를 더할 sum값과 i값을 대신 받을 num을 만들어준다.
  3. while문을 통해 sum에 i값의 자릿수까지 모두 더하게 한다.
  4. 그렇게 구한 sum이 입력받은 N과 일치하면 해당 값을 출력하고 프로그램을 종료한다.
  5. 문제에서 가장 작은 생성자를 구해내는 것이기 때문에 순차적으로 for문을 돌리면서 초기에 일치한 값이 가장 작은 생성자가 된다.
코드
#include <iostream>
using namespace std;

int main() {
	int N;
	cin >> N;

	for (int i = 0; i < N; i++) {
		int sum = i; //자릿수 총 합계를 위한 것
		int num = i; //i값 자릿수를 위한 것

		while (num != 0) {
			sum += num % 10; //i값과 해당 i값의 각 자릿수를 더함.
			num /= 10; //자릿수 계산을 위한 연산
		}

		if (sum == N) { //만약 자릿수 합계가 입력받은 N과 같다면 출력하고 종료
			cout << i;
			return 0;
		}
	}

	cout << 0;
}
결과