본문 바로가기
알고리즘

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

by lewns2 2021. 6. 23.

단계별로 풀어보기 > 브루트포스 > [1단계] 2231번

 

문제 링크 : https://www.acmicpc.net/problem/2231

 

2231번: 분해합

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

www.acmicpc.net

 

문제 요약

  1. 구해야 할 것 : N의 가장 작은 생성자
  2. 예시) 256(N;입력) = 245(원하는 정답;출력) + 2 + 4 + 5(각 자리수의 합)

생성자가 여러 개인 경우 가장 작은 것을 출력

 

입력 복사

 예제 입력 1 >> 출력 : 198

216

 

CODE

#include <iostream>

using namespace std;

// 각 자리수의 합을 구하는 함수 
int part(int a) {
	int sum = a;
	
	while(a) {
		sum += a % 10;
		a/=10;
	}
	return sum;
}

int main() {
	int n;
	cin >> n;
	
	for(int i = 1; i < n; i++) {
		int sum = part(i);
		if(sum == n) {
			cout << i << endl;
			return 0;	// 가장 작은 수를 출력하기 위함(1) 
		}
	}
	
	cout << 0 << endl; // 가장 작은 수를 출력하기 위함(2) 
}
#include <bits/stdc++.h>
using namespace std;

#define MOD 1000000007
#define endl "\n"
#define lli long long int
#define ll long long
#define mp make_pair
#define pb push_back

template <typename T>
T part(T x)
{
	int sum = x;
	
	while(x) {
		sum += x % 10;
		x /= 10;
	}
	return sum;
}

int main() {
	int n;
	cin >> n;
	
	for(int i = 1; i < n; i++) {
		int sum = part(i);
		if(sum == n) {
			cout << i << endl;
			return 0;
		}
	}
	
	cout << 0 << endl;
}

문제 풀이

1. 출력은 입력보다 무조건 작을 것이 분명함. 그러므로 for문을 통해 "1~입력" 까지 범위 설정.

2. 분해합(각 자리수의 합과 자기 자신을 더한 값)이 입력과 동일할 경우 출력.

3. 생성자가 여러개인 경우 가장 작은 생성자 출력

 

새롭게 알게 된 점 

return 0의 의미

 

"return 0"는 int 0를 반환한다는 뜻이나, 운영체제에서 현재 실행 중인 함수를 종료하기 위해 사용한다.

 

위의 경우, 처음 나오는 값이 가장 작은 수이므로 굳이 끝까지 함수를 돌릴 필요가 없다.

그러므로 return 0를 사용하여 값이 나오게되면 즉시 함수를 종료한다.

 

 

728x90
반응형