본문 바로가기
개인 공부/코딩테스트

[C++] 백준 2231번 분해합 :: seoftware

by seowit 2020. 3. 14.

문제

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

 

2231번: 분해합

문제 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다. 자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그

www.acmicpc.net

소스코드

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

int main(void) {
	int N; cin >> N;
	int digit = 0;
	int m = N;
	while (m) {
		m /= 10;
		digit++;
	}
	//범위는 N-digit*9 ~ N
	int answer = 0; int complete = false;
	for (int i = digit * 9; i > 0; i--) {
		int now = N - i;
		string s = to_string(now);
		int sum = now;
		for (int j = 0; j < s.length(); j++) {
			sum += s[j]-'0';
		}
		if (sum == N) {
			answer = now;
			complete = true;
			break;
		}
	}

	if (complete) cout << answer << endl;
	else cout << 0 << endl;
}

코드설명

1. N의 자릿수를 구한다. 예를 들어 216의 자릿수를 구하려면 216/10 = 21, 21/10 = 2, 2/10= 0 이렇게 0이 될 때까지 10으로 나누어 주면 구할 수 있다. 따라서 216의 자리수 digit은 3이다.

2. 216의 각각의 자릿수가 가질 수 있는 최댓값은 9이다. 따라서 216이 분해합이 될 수 있는 최솟값은 216-3*9 = 189 이다. 따라서 189부터 216까지의 숫자에 대한 분해합을 구하고, 그 수가 216인지 확인하면 된다.

3. 각각의 자릿수를 더하기 위해 정수 216을 string으로 변환한다(to_string). 그 다음 모든 자릿수 -'0'을 하면 숫자의 아스키코드 값이 되는데, 그렇게 하여 각각의 자릿수와 자기 자신을 더해준다. 그 결과가 216인지 확인하는 것이 끝이다!

댓글