[백준] 2231번. 분해합

연성·2020년 11월 16일
0

코딩테스트

목록 보기
143/261
post-custom-banner

[백준] 2231번. 분해합

1. 문제

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

2. 입력

첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

3. 출력

첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.

4. 풀이

예전부터 풀고 싶었는데 감이 잘 안와서 못 풀었는데...

  • 그냥 하나하나 되는지 안 되는지 해보는 거였다.
  • 최솟값을 구하기 때문에 작은 값부터 하나만 나오면 바로 중단하고 출력한다.
  • answer의 초기값을 0으로 두어 loop를 다 돌았는데 아무 변화가 없으면 알아서 0을 출력한다.
  • 값의 범위를 어디로 잡는게 좋을지 모르겠어서 (자리 수 하나 작은 것) ~ (자리 수 하나 큰 것)까지 했다.
    더 줄이고 싶었는데 상세하게 구하고 싶지 않았다...ㅎ

5. 처음 코드와 달라진 점

  • 자리 수를 착각해서 pow(10, 자릿 수-1)로 해서 의도한대로 나오지 않았다. pow(10, 자릿 수-2)로 두면 1자리 이하일 때 음수가 들어가서 분수가 나오는데 int에 넣으니까 알아서 0이 되었다.

6. 코드

#include <iostream>
#include <cmath>

using namespace std;

int get_length(int number) {
    int count = 0;
    while (number>0){
        number /= 10;
        count++;
    }
    return count;
}

bool is_constructor(int number, int target_number) {
    int tmp = number;
    while (tmp > 0) {
        number += tmp % 10;
        tmp /= 10;
    }
    return number == target_number ? true : false;
}

int main(void) {
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);

    int n;
    cin >> n;

    int len = get_length(n);
    int number = pow(10, len - 2);
    int end_number = pow(10, len + 1);

    int answer = 0;
    while (number<=end_number){
        if (is_constructor(number, n)) {
            answer = number;
            break;
        }
        number++;
    }
    cout << answer;
}
post-custom-banner

0개의 댓글