문제설명

 

소스코드

#include <iostream>
#include <string>
using namespace std;
int main() {
	int N; int ans = 0;
	cin >> N;
	for (int i = 1; i < N; ++i)
	{
		string str = to_string(i); //i를 문자열로 바꿈
		string* arr = new string[str.length()]; //i의 자리수 만큼 string 타입 배열 동적할당
		for (int j = 0; j < str.length(); ++j) arr[j] = str[j]; //i의 각 자리수를 복사
		int sum = i; //분해합에선 자기 자신을 더해야하므로
		for (int j = 0; j < str.length(); ++j) sum += stoi(arr[j]); //각 자리수를 더한다.
		if (sum == N) //N과 분해합을 찾았다면
		{
			ans = i;
			break;
		}
		delete[] arr; //메모리 해제
	}
	cout << ans;
}

 

설명

  • N의 생성자를 찾으려면, 1부터 N-1까지 탐색하면서 분해합이 N인 수를 구하면된다.
  • str은 i를 문자열로 바꾼 값을 저장하고, arr은 string타입 배열을 i의 자리수 만큼 동적 할당한다.
  • 이후 각 자리수를 arr로 복사한다. -> arr[j] = str[j]
  • i와 arr의 각 원소를 모두 더한다. -> 분해합
  • 더한 값과 N이 같다면 생성자를 찾은 것.
  • 가장 작은 생성자를 출력하라고 하였으므로, 오름차순으로 생성자를 찾아나가기 때문에 가장 처음 찾은 생성자가 답이 될 것이다.

굳이 이렇게 만든 이유는 아래의 오류때문이다.

stoi() 함수는 문자열 원소 하나를 int 타입으로 바꾸려고 하면 위와 같은 오류가 뜬다.

이거 해결방법 아시는 분은 댓글 부탁드려요.