[JAVA] 분해합

NoHae·2025년 3월 18일

백준

목록 보기
20/106

문제 출처

단계별로 풀어보기 > 브루트 포스 > 분해합
https://www.acmicpc.net/problem/2231

문제 설명

%분해합 : 자연수 N이 주어질 때, N과 N을 이루는 각 자리수의 합
%생성자 : 분해합이 자연수 N이 되는 자연수

어떤 자연수 N이 주어질 때, 가장 작은 생성자 M을 return하라.

접근 방법

1부터 시작하여 계속해서 자연수의 각 자리수 + 자연수를 더해서 그 값이 주어진 값이 맞는가 확인하면 된다.

String의 length()를 이용하여 푼 풀이

import java.io.*;

public class 분해합 {

    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 M = 0;

        for(int i = 1; i<N; i++){
            int length = String.valueOf(i).length(); // 계산할 i의 자릿수
            int sum = i;

            for(int j = 0; j<length; j++){
                 int nextNum =Integer.parseInt(String.valueOf(String.valueOf(i).charAt(j)));
                 sum += nextNum;
            }

            if(sum == N){
                M = i;
                break;
            }
        }

        bw.write(String.valueOf(M));
        bw.flush();
        bw.close();
        br.close();

    }

}

i를 10씩 나누어 나머지를 확인하여 계산한 풀이

import java.io.*;

public class 분해합_divide {

    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 M = 0;

        for(int i = 1; i<N; i++){

            int length = String.valueOf(i).length();
            int num = i;
            int sum = num;

            for(int j = 0; j<length; j++){
                int divNum = num % 10;
                sum += divNum;
                num /= 10;
            }

            if(sum == N){
                M = i;
                break;
            }

        }

        bw.write(String.valueOf(M));
        bw.flush();
        bw.close();
        br.close();

    }

}

Review

import java.io.*;

public class 분해합_review {

    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 M = 0;

        for(int i = 1; i<N; i++){
            int sum = i;
            int num = i;
            while(num > 0){
                sum += num % 10;
                num /= 10;
            }
            if(sum == N){
                M = i;
                break;
            }
        }
        bw.write(String.valueOf(M));
        bw.flush();
        bw.close();
        br.close();
    }

}

알게된 점

각자리수를 더한다는 것을 너무 어렵게 생각했다.
간단하게 i에 10으로 나눈 나머지를 확인하고, i를 다시 10으로 나눈 몫을 저장하면 된다.

문제푼 흔적



Review

profile
노력 해보려고 하는 사람(00년생 소프트웨어융합학과, 24년 12월 부터 백엔드 및 코테 공부 시작)

0개의 댓글