백준/C++

[백준] 2231번: 분해합 | C++ 풀이

성실한 당근농부 2023. 6. 27. 23:16

# 문제

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

 

 


 

# 풀이

이번에도 브루트포스 문제다. 모든 경우를 탐색한다고 생각하면 오히려 구현하기가 쉬우니 천천히 생각하며 풀어보자.

바로 정답 소스코드 확인!

 

#include <iostream>
using namespace std;

int decompositionSum(int n);

int main(){ 
    int n;
    cin >> n;
    int m = 1;
    bool print = 0;

    while(m < n){
        if(n == decompositionSum(m)){
            print = 1;
            cout << m;
            break;
        } else m++;
    }
    
    if(!print) cout << 0;
    return 0;
}

int decompositionSum(int n){
    int sum = n;
    while(n > 0){
        sum += n%10;
        n /= 10;
    }
    return sum;
}

이번에는 분해합을 구하는 함수를 따로 구현해주었다.

가장 작은 생성자를 구해야 하므로 분해합 탐색은 1부터 시작하고 (int m = 1), 만약 생성자가 존재하지 않을 경우 0을 출력해야하므로 존재 여부를 체크해줄 bool 타입 변수 check 변수도 만들어주었다.

 

 

 

int decompositionSum(int n){
    int sum = n;
    while(n > 0){
        sum += n%10;
        n /= 10;
    }
    return sum;
}

분해합을 구해주는 decompositionSum함수를 먼저 살펴보자. int 타입을 반환하는 함수로 분해합을 구할 int 타입 숫자를 인자로 받아온다. 예를 들어 245의 경우, 245 + 2 + 4 + 5 = 256이 245의 분해합이 되므로 나눗셈 연산과 나머지 연산을 활용해 해당 정의에 맞춰 분해합 함수를 구현해준다. 연산을 끝낸 후엔 sum 값을 반환해주면 분해합 반환 완료!

 

 

 

while(m < n){
    if(n == decompositionSum(m)){
        print = 1;
        cout << m;
        break;
    } else m++;
}
    
if(!print) cout << 0;

다시 main 코드로 돌아와 가장 작은 분해합을 구해야 하므로 m을 하나씩 증가시키며 모든 분해합을 탐색해준다.

가장 작은 경우를 탐색하기 위해 1부터 코드를 실행시키고 있으므로,만약 m의 분해합이 n과 같은 경우 m은 n의 가장 작은 생성자가 된다.

가장 작은 생성자를 찾았을 경우 print 변수를 true로 변경 및 m을 출력 후 반복문을 끝내주고, 아닐 경우에는 m을 하나씩 증가시키며 탐색을 이어나간다. 반복문을 탈출한 후에 print 변수가 여전히 false라면 생성자가 존재하지 않는다는 의미이므로 0을 출력해주면 끝이다!

 

 

 

 

 

 


 

 

 

2231번: 분해합

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

www.acmicpc.net

 

728x90