본문 바로가기
Computer/Algorithm_Java

[BaekJoon] 2231번 분해합 문제풀이 (Success)

by HJ0216 2023. 8. 6.
 

2231번: 분해합

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

www.acmicpc.net

 

Language: Java

 

🚨 고민해보다 푸는 방법을 도저히 모르겠어서, 풀이를 찾아 봄

 

😮 찾아본 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int N = Integer.parseInt(br.readLine());
 
        int i = 0;
        for (i = 0; i < N; i++) {
            int num = i;
            int sum = 0;
 
            while (num != 0) {
                sum += num % 10;
                num /= 10;
            }
 
            if ((sum + i) == N) {
                bw.write(i + "");
                break;
            }
        }
 
        if (i == N) {
            bw.write("0");
        }
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

1. while 반복문

    - num: 생성자

    - sum: 생성자 각 자리의 합

  ⭐ sum을 구하기 위해 생성자 역할을 하는 i 이외에도 i와 동일한 값을 갖는 num 선언

2. if 조건문

    - 분해합이 입력된 수와 동일한 경우가 없을 때, i는 for문을 다 돌고, i==N일 때 마무리되므로 조건식을 다음과 같이 선언

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        String s = br.readLine();
        int N = Integer.parseInt(s);
 
        int i = 0;
        for (i = N - s.length() * 9; i < N; i++) {
            int num = i;
            int sum = 0;
 
            while (num != 0) {
                sum += num % 10;
                num /= 10;
            }
 
            if ((sum + i) == N) {
                bw.write(i + "");
                break;
            }
        }
 
        if (i == N) {
            bw.write("0");
        }
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

⭐ 생성자의 범위

    - 생성자 + 자리수의 합 == 입력값

    - 생성자 == 입력값 - 자리수의 합

    - 자리수의 합이 최대일 경우, 생성자는 최소

    - 만일 생성자 후보가 자리수 합이 최대일 때의 생성자보다 작다면 입력값을 만들 수 없음

 

🤔 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        String s = br.readLine();
        int N = Integer.parseInt(s);
 
        int i = 1;
        for (i = N - s.length() * 9>=1 ? N - s.length() * 9 : 0; i < N; i++) {
            int num = i;
            int sum = 0;
 
            while (num != 0) {
                sum += num % 10;
                num /= 10;
            }
 
            if ((sum + i) == N) {
                bw.write(i + "");
                break;
            }
        }
 
        if (i == N) {
            bw.write("0");
        }
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

- 생성자는 자연수이므로 i의 최소값을 1로 변경

 

 

 

🔗 소스 코드
HJ0216/TIL/BOJ

 

📚 참고 자료

 

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

www.acmicpc.net/problem/2231 2231번: 분해합 문제 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다

st-lab.tistory.com