• Home
  • About
    • 코드좀비 photo

      코드좀비

      An amazing website.

    • Learn More
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[BOJ] 백준 2231 분해합 간단한설명과 코드 C++

28 Mar 2020

Reading time ~1 minute

문제 정보

백준 ( BOJ ) 2231 분해합

문제 풀이 : 시뮬레이션

문제 출처 : https://www.acmicpc.net/problem/2231

시작 Thinking

이걸 가장 작은 값을 찾으려면 0부터 해야할까?

라는 생각으로 시작 해 주시면 됩니다.

다른분들 풀이를 보니 0에서 시작해도 되긴 하더라구요.

그래도 우리는 더 극한의 상황에 대비해야 합니다.

그렇다면 탐색을 어디서부터 시작 해야 할 까요?

N의 값은 1 이상 100만 이하입니다.

정답도 당연히 100만 이하가 되겠죠.

그럼, N 이 주어졌을때 정답과의 최대 차이는 몇일까? 에서 시작 해 보도록 합시다.

N = 정답 + 정답의 각 자릿수의 합

이 공식이 됩니다.

그렇다면 N - 정답의 각 자릿수의 합 = 정답

이라는 이야기도 하죠.

정답의 각 자릿수의 합의 최대치는 몇일까요?

당연히 9로 도배된 수가 가장 큰 자릿수의 합이 될 겁니다.

정답이 될 순 없지만

999,999 이값의 각 자릿수의 합은

9*6 = 54 입니다.

즉, 100만 이하의 숫자에서 어떤 각 자리숫자의 합도 54를 넘지 못한다는겁니다.

여기까지 오시면 눈치 채셨을 거라고 생각합니다.

N에서 54를 빼고, 그 부분부터 탐색을 시작 해 주면 됩니다.

코드

#include <iostream>


using namespace std;


int n;
int temp;

bool cal() {
	int compare = temp;
	int temptemp = temp;
	while (temptemp > 0) {
		compare += temptemp % 10;
		temptemp /= 10;
	}
	if (compare == n)
		return true;
	else
		return false;
}

int main() {
	cin >> n; 
	int result = 0;
	int results = 0;
	if (n > 54)
		temp = n - 54;
	else
		temp = 0;

	while (temp < n) {
		if (cal() == true) {
			result = temp;
			break;
		}
		temp++;
	}

	cout << result;
	

}


백준C++시뮬레이션 Share Tweet +1