본문 바로가기

백준

[백준] 2231 분해합_ JAVA

●문제 : 자연수 N의 가장 작은 생성자를 구하는 프로그램

 

 


● 풀이

 

자연수 N이 주어졌을 때, 1부터 N까지 모든 수의 분해합을 구해보면서, 가장 작은 생성자를 구해야 하므로, 첫 분해합이 자연수와 같으면 그 수를 출력한다.


첫 번째 풀이

위를 생각하며 10의 자리 일 때, 100의 자리 일 때 분해합을 구하는 코드를 쓰다가 생각해보니 입력 조건이 "첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다." 이다.. 

그럼 이건 실패.

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int cs = in.nextInt();

        int n = 0;
        for (int i = 0; i <= cs; i++) {
            if(i<10){
                n = i;
            }else if (i < 100){
                n = i + (i/10) + (i%10);
            }
        }
    }
}

 

두 번째 풀이

받는 수의 길이에 상관없이 각 자리수를 더하는 식의 코드를 구현하기. 

오류가 난다.

문제점 : while(i != 0) { ~ } 식에서 i를 가져와 수정하였는데, 외부 루프의 제어 변수를 변경하는 것은 문제가 되므로, 새로운 변수에 복사하여 사용해야 한다! 중요

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int cs = in.nextInt();

        int n = 0, result = 0;

        for (int i = 0; i <= cs; i++) {
            while (i != 0) {
                n += i % 10;
                i /= 10;
            }

            if(n + i == cs){
                result = i;
                break;
            }
        }
        System.out.println(result);
    }
}

 

 


 

● 최종 풀이 

i를 직접 가져와 수정하지 않고 새로운 임시 변수를 만들어 계산하였다.

 

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int cs = in.nextInt();

        int result = 0;
        
        for (int i = 0; i < cs; i++) {
            int n = 0;
            int temp = i;

            while (temp != 0) {
                n += temp % 10;
                temp /= 10;
            }

            if (n + i == cs) {
                result = i;
                break;
            }
        }
        System.out.println(result);
    }
}

 

 


최종 정리 : 외부 루프의 제어 변수를 루프 내에서 변경하는 것은 문제가 된다.

새로운 변수에 복사하여 값을 변경하여야 한다!!

'백준' 카테고리의 다른 글

[백준] 2798 블랙잭_ JAVA  (0) 2023.06.03
[백준] 2292 벌집_ JAVA  (0) 2023.06.03
[백준] 1978 소수 찾기_ JAVA  (0) 2023.06.03
[백준] 10250 ACM 호텔_ JAVA  (1) 2023.06.03
[백준] 1085 직사각형에서 탈출_ JAVA  (0) 2023.06.02