백준 2231 분해합 [JAVA]

Ga0·2023년 4월 12일
0

baekjoon

목록 보기
27/125

문제 해석

  • 이문제를 이해하기 위해 꽤 많은 시간이 소요되었다..(문해력이 좀 부족한 듯 싶다.😂)
  • 문제를 해석해보자면,
  • 어떤 자연수(N)을 입력받아서 그 자연수를 만들 수 있는 어떤 자연수(M)을 찾으면 되는 문제이다.
  • 만들어야하는 숫자(N)을 만들 수 있는 기준을 충족하면 N의 생성자(M)이라고 부를 수 있는데, 그 기준은 아래와 같다.
  • N은 여러개의 생성자를 가질 수도, 아예 안가질 수도 있다.
  • 여러개를 가지는 경우는 가장 작은 생성자를 생성자가 없을 경우는 0을 출력하면 된다.

  • 이 풀이 과정을 코드로 적은 게 바로 아래 코드이다.( 코드의 자세한 설명은 주석으로 작성해두었다.)

코드


import java.io.*;

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());
        br.close();
        
        int M = 0; //결과 값을 저장하는 함수[생성자가 없으면 0을 출력하기 때문에 초기값 0]
        
        for(int i = 1; i <= N; i++) {
            int number = i; // i값
            int res = 0; //각 자리수를 더한 값을 저장하는 변수
            
            while(number > 0){ // 해당 값이 0보다 작아질때까지 반복
                res += number % 10; // 자리수를 10씩 분해해서 해당 자리수의 모든 값을 더하여(누적) res에 저장
                number /= 10; //현재 반복을 돌고 있는 number의 값을 10씩 분해하여 계속 반복함.
            }

            if(res + i == N){ //만약 현재 i(즉 i마다 반복문 시작했을 때의 초기 number)값이랑 해당 자리수를 누적더한 값과 같을때
                M = i; // 생성자라는 뜻이니 M에 i를 넣고
                break; //반복문을 마친다.(가장 작은 생성자를 출력하니까)
            }
        }
        bw.write(M + "\n");
        bw.flush();
        bw.close();
    }
}

결과

느낀점

  • 이제 문제를 이해하는 게 점점 어려워지는 것 같다.
  • 처음에 이 2231 분해합 설명을 읽고는 "무슨 소리이지?" 계속 생각하고, 읽고, 생각하고, 읽고 문제를 이해하지 못해서 멍해 있었다.
  • 책을 좀 많이 읽어야했는데... 앞으로 더 많은 코드들을 작성하면 더 어려운 문제가 많을 텐데 이해하기 어려운 문제들도 많이 마주할텐데... 좀 벌써부터 걱정된다.
  • 하지만, 해야지!

0개의 댓글