본문 바로가기
문제 풀이/백준(BOJ)

[C] 백준 2231번 : 분해합

by 희조당 2021. 4. 6.
728x90

www.acmicpc.net/problem/2231

 

2231번: 분해합

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

www.acmicpc.net


문제 접근

 1. 입력받은 값의 자릿수를 구한다. 

 2. 입력받은 값에서 자릿수*9한 값부터 따져서 가장 처음 걸리는 조건이 최솟값, 없으면 0을 출력

느낀점

처음에 백만까지 입력을 받았을 경우 어떻게 해야하나 고민을 많이 했다. 고민 끝에 분해합은 원래 숫자에서 각 자릿수를 더하는 것이기 때문에 한 자릿수당 최대 9만큼 빠질 수 있다. 따라서, n자릿수라고 했을 때 제일 작은 생성자는 9*n을 뺀 값부터 시작될 수 있다. 생각보다 정확하게 접근해서 재밌게 풀었다.

코드

#include <stdio.h>

int share(int n) {
	int tmp = n, sum = 0;
	while (tmp != 0) {
		sum += tmp % 10;
		tmp /= 10;
	}
	return sum;
}

int main() {
	int n;
	scanf("%d", &n);
	int tmp = n, length = 0;
	int i, flag = 0;
	while (tmp!=0) {
		tmp /= 10;
		length++;
	}
	
	for (i = n - 9 * length;i < n;i++) {
		if (n == i + share(i)) {
			flag = 1;
			break;
		}
	}
	
	flag == 1 ? printf("%d", i) : printf("0");
	return 0;
}

댓글