백준 2231: 분배합 C++

랄라콥스·2025년 3월 24일

CT

목록 보기
2/2

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

문제 탐색

분배합...생성자...
익숙한 단어가 아니라 자꾸 반대로 생각하게 되느라 이해를 좀 하느라 시간이 걸렸습니다..ㅎㅎㅋㅋㅋ

숫자 N이 주어졌을 때, M은 N = M + M의 각자리수 이를 성립해야합니다.

ex. N : 216 M: 198 => 198 + 1 + 9 + 8 = 216

N의 범위가 1 ≤ N ≤ 1,000,000이므로 각자리수를 자동으로 판단하여 분배합을 구하는 식이 필요하고!. -> 필요한 식 1

그 이후 가장 작은 분배합을 구하는 식이 필요합니다. -> 식 2

필요한 식

1) 분배합

while(num != 0){
    int a = num%10;
    sum += a;
    num/= 10;
  }

  sum += input;

sum은 해당 input에 대해 분배합을 저장하는 변수입니다.

2) 가장 작은 분배합

if(sum == n) {
    if(answer > input){
      answer = input;
    }
  }

분해합이 초기 주어진 N과 비교하여 같고, 이전의 구한 수보다 작을 경우 답을 바꿉니다.

전체 코드

#include <iostream>

using namespace std;

int n;
int sum = 0;
int answer;

void find(int input){
  sum = 0;
  int num = input;

  while(num != 0){
    int a = num%10;
    sum += a;
    num/= 10;
  }

  sum += input;

  if(sum == n) {
    if(answer > input){
      answer = input;
    }
  }

}

int main(){
  scanf("%d", &n);
  answer = n;

  for(int i = 1; i < n ; i++){
    find(n-i); 
  }

  if(answer == n) answer = 0;

  cout << answer;

  return 0;
}
profile
일단 책을 피자

0개의 댓글