suheang

[백준] | JAVA, 자바 | 2231번 - 분해합 본문

알고리즘

[백준] | JAVA, 자바 | 2231번 - 분해합

suheang 2024. 3. 14. 21:21

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

 

2231번: 분해합

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

www.acmicpc.net


문제 요약 :

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

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

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


문제 풀이 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int result = 0;

        for (int i = 0; i < n; i++) {
            int sum = i;
            int number = i;
            while (number > 0) {
                sum += number % 10;
                number /= 10;
            }
            if (sum == n) {
                result = i;
                break;
            }
        }
        System.out.println(result);
    }
}

 

1. 자연수 n 입력받기

2. 생성자를 저장할 변수 result 생성

3. for문을 사용해 생성자를 구함

4. 합이 n 이라면 result에 저장하고 for문 종료

(for문을 종료하는 이유는 0부터 n까지 1씩 증가하며 비교했기 때문에 처음 나온 생성자가 N의 가장 작은 생성자)

 

예시)

216을 입력받는다면 i가 198일 때, sum 198, number 198

number가 0 이상이기 때문에 while문을 적용, 198을 10으로 나눈 나머지 8을 sum에 합하여 저장

198를 10으로 나눈다면 19가 되고 8은 버려진다.19는 0 이상이기 때문에 다시 10으로 나눈 나머지 9를 sum에 합하여 저장

19를 10으로 나눈다면 1이 된다. 1은 0 이상이기 때문에 다시 10으로 나눈 나머지 1을 sum에 합하여 저장

1을 10으로 나눈다면 0이 되기때문에 while문이 종료된다.

이때 sum은 198 + 8 + 9 + 1 = 216으로 n과 같기 때문에 생성자가 돼서 result에 저장되고 for문은 종료된다.

 

5. 저장된 result 출력 (생성자가 있다면 저장된 생성자가, 생성자가 없다면 초기화한 값인 0이 출력)