본문 바로가기
공부기록/[Algorithm]

백준 2231번 <분해합> - C++

by RiverWon 2024. 8. 11.

생각


브루트포스를 해야..겠지?

1. 입력받은 n까지 반복을 돌린다

2. 가장 작은 생성자를 찾아야 하기에, 최초 생성자가 발견되면 세울 플래그를 조건식으로 준다.

3. 현재 순회중인 수 i를 string type로 바꾼다. 각 자리수를 따로 계산하기 위해서이다.

4. total 변수에 i와 string으로 바꾼 z의 각 인덱스에 해당하는 수 - '0'(ASCII값)을 더해준다

   (Ex : 145 → 145 + 1 + 4 + 5)

5. total값과 n값을 비교해서 같으면 생성자를 찾은 것이므로 그 생성자(total)을 출력하고, 플래그 세운 뒤 break

6. break가 세워져 있지 않다 → 생성자를 찾지 못했다 → 0

 

실수한 부분이 있어 여러 번 다시 풀었다.

생성자가 없는 경우에는 0을 출력해야 한다는 건 알고 있었는데, 한 자리 숫자에 대해서는 모두 그 처리를 해줘야 한다는 것이다. 예를 들어, n이 8이면 생성자가 8이 아니라, 없는 것이다!!! 또, n이 14이면 생성자는 7이다. 이걸 잘못 생각하고 있어서 재시도해서 문제를 풀었는데 ,주어진 문제의 의도를 정확하게 받아들이지 못했다.

 

#include <algorithm>
#include <iostream>
#include <math.h> //C
#include <cmath> //C++
#include <string>

using namespace std;

int main() {
  
  int n;
  cin >> n;
  
  bool flag = false;

    for(int i=1; i<=n; i++){
      if(!flag){
        int total = i;
        string z = to_string(i);
        for(int j = 0; j<z.length(); j++){
          total += z[j] - '0';
        }
        if(total == n) {
          cout << z; 
          flag=true;
          break;
        }
      }
    }  
  if(!flag) cout << 0;
}