[Java] 백준 2231번: 분해합

hansung's·2024년 3월 6일
0

문제 url:
분해합

문제:

🤔 문제 알아보기

자연수 N을 입력받으면, 자연수 N이 되기 위한 분해합을 출력받는 문제이다.

  • 분해합이란, M과 M을 이루는 각 자리수들을 더한 값을 의미한다.
    • 즉, 이를 모두 더하면 N이 되는 것이다.
  • 그렇다면, 우리는 자연수 N을 만들기 위해서 N이하의 모든 값을 다 계산해서 분해합을 구하면 답을 구할 수 있는 브루트 포스 알고리즘 문제이다.
  • 그럼 N이하의 모든 값을 구하기 위해 반복문을 통하여 구해 보자.

🐱‍👤 실제 코드

import java.io.*;

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 sum = 0;
        for (int i =1; i<N; i++) {

            sum = i + ( i / 1000000) + ((i % 1000000) / 100000) + (((i % 1000000) % 100000) / 10000)
                    + ((((i % 1000000) % 100000) % 10000) / 1000)
                    + (((((i % 1000000) % 100000) % 10000) % 1000) / 100) + ((((((i % 1000000) % 100000) % 10000) % 1000) % 100) / 10)
                    + ((((((i % 1000000) % 100000) % 10000) % 1000) % 100) % 10) ;

            if(sum == N) {
                System.out.println(i);
                break;
            }

        }
        if (sum != N) {
            System.out.println(0);

        }

    }
}

코드 리팩토링 시간에 코드 분석을 하고자 하여, 전체 로직만 간단하게 설명하고자 한다.

위에서 설명했듯, 자연수 N의 분해합을 구하기 위해 N보다 작은 모든 값들을 계산한다. 이는 for문을 이용해서 풀 수 있다.

sum은 분해합의 값을 넣을 변수로 분해합은 자연수 M과 M의 각 자리수의 합으로 이루어져 있다.
해당 코드는 굉장히 하드하게 짜서 어지러운데, 말로 설명을 하면
조건에서 N은 1,000,000 이하라고 했기 때문에 1,000,000 자리부터 1자리까지 계산한 로직이다.

이렇게 짜면 답은 맞게 나오지만, 망한다.. 공부를 위해서는 코드 리팩토링을 참고

🤢 코드 리팩토링

import java.io.*;

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 = 1; i < N; i++) {
            int number = i;
            int sum = 0;

            while(number != 0) {
                // number(i)의 1의 자리를 구할 수 있다.
                sum += number % 10;

                // 10을 나눔으로 이전에 구했던 일의 자리는 절삭.
                number /= 10;
            }

            if(sum + i == N) {
                result += i;
                break;
            }
        }
        System.out.println(result);



    }
}

🤢 회고

각 자리수를 나누는 방법을 계산하지 못해 저렇게 하드 코딩식으로 했는데..
알고나니 충분히 생각할 수 있던 로직이었다
아직 경험이 부족하다고 생각하며 위안을 가지지만, 이러한 로직을 보면 볼수록 많은 생각을 하며 문제를 풀어 나가야겠다는 생각이 든다.

profile
ABAPER를 꿈꾸는 개발자

0개의 댓글