문제설명
소스코드
#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 타입으로 바꾸려고 하면 위와 같은 오류가 뜬다.
이거 해결방법 아시는 분은 댓글 부탁드려요.
'자료구조 & 알고리즘 > BOJ' 카테고리의 다른 글
[C++] 백준 - 10845번 문제 (큐) (0) | 2023.06.26 |
---|---|
[C++] 백준 6단계 - 4344번 문제 (평균은 넘겠지) (0) | 2023.06.26 |
[C++] 백준 12단계 - 2798번 문제 (블랙잭) (0) | 2023.06.25 |
[C++] 백준 19단계 - 18028번 문제 (스택) (0) | 2023.06.25 |
[JAVA] 백준 - 11282번 문제 (한글) (0) | 2023.06.23 |