[백준/BOJ] 백준 2231번 : 분해합

2020. 6. 3. 19:43알고리즘 문제풀이

https://www.acmicpc.net/problem/2231

 

2231번: 분해합

문제 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+

www.acmicpc.net

완전 탐색(브루트 포스)을 통해 문제를 해결하였다.

문자열로 n을 입력받고 n의 가장 작은 생성자를 찾기 위해 0부터 n의 생성자가 맞는지 확인하였다.

 

코드

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int solve(string n)
{
	int ret = 987654321;

	//0부터 생성자를 찾는다.
	for (int i = 0; i < stoi(n); i++)
	{
		int sum = 0;

		for (int j = 0; j < to_string(i).size(); j++)
		{
			//각 자릿수의 합을 더한다
			sum += stoi(to_string(i).substr(j,1));
		}
		//해당 수를 더한다
		sum += i;

		//만약 생성자라면
		if (sum == stoi(n))
		{
			ret = i;
			//0부터 찾기 시작했으므로
			//가장 작은 생성자
			return ret;
		}
	}
	//생성자를 못찾은 경우는
	//987654321을 리턴
	return ret;
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	string n;
	int result;
	cin >> n;

	result = solve(n);

	if (result == 987654321)
		cout << 0;
	else
		cout << result;

	return 0;
}