본문 바로가기

코딩/백준 BOJ

[백준/C언어] 2231번 - 분해합

백준 웹사이트 "2231번 - 분해합" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

2231번: 분해합

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

www.acmicpc.net


소스 코드

#include <stdio.h>

// 1. 입력된 수의 분해합을 구하는 프로그램을 작성한다.
int find_dn(int n);

int main(void){
    int N;
    scanf("%d", &N);

// 2. N 이하 모든 수의 분해합을 계산 및 비교한다.
    for(int i=1; i<=N; i++){
        if(find_dn(i) == N){
            printf("%d\n", i);
            break;
        }
        if(i==N)
            printf("0");
    }
}

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

문제 풀이

  이전 문제 중에서 '생성자'에 대해 다루는 문제가 있었습니다. 백준 "4673번 - 셀프 넘버" 문제는 분해합을 계산하는 함수를 작성한 뒤, 이용하는 문제였습니다. 이 문제에서도 그때의 코드를 참고하여, 분해합을 계산하는 함수 'find_dn'을 이용해줍니다.

  브루트 포스 알고리즘을 어떻게 이용할 수 있을까요? N이 주어지면, N보다 작은 모든 수에 대해 'find_dn'을 적용하여 생성자를 찾을 수 있습니다. 분해합의 정의가 주어진 수와 그 수의 각 자릿수의 합이므로, 어떤 수의 생성자는 그 수보다 클 수 없습니다 (1의 경우도, 주어진 수(1)와 그 수의 각 자릿수(1)의 합은 2입니다). 따라서 브루트 포스 알고리즘으로, N 이하 모든 수의 분해합을 계산 및 비교합니다. 도중에 N의 생성자가 발견되면 이를 출력하고 for문을 종료하며, 끝까지 발견되지 않는다면 0을 출력합니다.

  아래는 백준 웹사이트 "4673번 - 셀프 넘버" 문제풀이 링크입니다. 4673번 역시 브루트 포스 알고리즘을 이용하는 문제이므로, 만약 풀어보지 않으셨다면 풀어보는 것을 추천합니다!

 

[백준/C언어] 4673번 - 셀프 넘버

백준 웹사이트 "4673번 - 셀프 넘버" 문제풀이입니다. 언어는 C언어입니다. (제출 언어: C99) 문제 4673번: 셀프 넘버 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서

loding.tistory.com

 

반응형