티스토리 뷰

알고리즘

[알고리즘] 분해합(백준2231번)

데브캣_DevCat 2022. 10. 15. 11:03

keyword : 자릿수합
difficulty : 하
completion : ✅
notice :


분해합

📝 문제

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

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

입력

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

출력

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

예제 입력 1

216

예제 출력 1

198


🔍 정답

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.ArrayList;  
import java.util.Collections;  


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());  
        ArrayList<Integer> M = new ArrayList<>();  

        for (int i = 1; i <= N; i++) {  
            if (sum(i) == N) {  
                M.add(i);  
                System.out.println(i);  
                break;  
            } else M.add(0);  
        }  
        if (Collections.max(M) == 0) System.out.println(0);  
    }  

    public static int sum(int num) {  
        int result = num;  
        while (num > 0) {  
            result += num % 10;  
            num /= 10;  
        }  
        return result;  
    }  
}
  • i = 1 부터 대입을 해보면서 N이 나오면 i 를 반환하고 나오지 않으면 0을 반환하면 되겠다 생각하고 시작을 했다.
  • sum 함수는 1부터 대입하는 함수로 매개변수 num은 생성자이고 result는 분해합이다.
  • 1부터 대입하면서 result(분해합)이 N과 같다면 그 분해합의 num(생성자)를 출력하고 break; 하였다.(최솟값만 출력하면 되므로)
  • 배열은 0을 어떻게 출력해야 될까 고민하다가 만든 것인데,
    • N = 8이라면, ArrayList M = [0, 0, 0, 4] 이런식으로 만들어질 것이고
    • N = 7이라면, [0, 0, 0, 0, 0, 0, 0] 이 될 것이다.
  • 만약 result(분해합)이 N과 같은 게 없으면 생성자가 없는 숫자이므로 배열은 모두 0으로 채워질 것이고 이는 곧 배열의 가장 큰 수가 0이라는 소리이기 때문에, 이런 경우 0을 출력하도록 하였다....
  • 풀고나서 다른 풀이를 보니 int 변수 = 0; 을 하나 선언해놓고 생성자가 있으면 그 생성자를 변수에 넣고 그렇지 않으면 그대로 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 answer = 0;  

        for (int i = 1; i <= N; i++) {  
            if (sum(i) == N) {  
                answer = i;  
                break;  
            }  
        }  
        System.out.println(answer);  
    }  

    public static int sum(int num) {  
        int result = num;  
        while (num > 0) {  
            result += num % 10;  
            num /= 10;  
        }  
        return result;  
    }  
}
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함