코딩테스트/백준

[백준 JAVA] 9506 - 약수들의 합

kittae 2024. 12. 4. 08:53

문제 자체는 쉬웠지만, 문제 해석을 잘못 해석해 애먹은 문제였다..!

 

먼저 내가 생각한 로직은 이렇다.

while(n < 0)
n % i == 0 -> ArrayList 적재

for (sum += ArrayList.get(i))
sum == num -> 약수 합 출력
sum != num ->  n is NOT perfect 출력

 

해당 로직을 보면 알다시피 완전수를 구하는 문제였는데, 필자는 그냥 테스트 케이스만 보고 순서대로 반복문으로 약수의 누적합을 비교해서 출력해 버린 것이었다! (맙소사,,)

 

먼저 내가 처음 작성한 코드다.

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true) {

            int n = Integer.parseInt(br.readLine());
            int sum = 0;
            int count = 0;
            ArrayList<Integer> arr = new ArrayList<>();

            if (n == -1)
                break;

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

                if (n % i == 0)
                    arr.add(i);
            }

            for (int i = 0; i < arr.size(); i++) {

                sum += arr.get(i);
                count++;

                if (sum > n) {
                    System.out.println(n + " is NOT perfect.");
                    break;
                }

                else if (sum == n) {

                    System.out.print(n + " = " + arr.get(0));

                    for (int j = 1 ; j < count; j++)
                        System.out.print(" + " + arr.get(j));
                    System.out.println();
                    break;
                }
            }
        }
    }
}

무수히 많은 에러 결과

 

다행히도 다음날 백준 고수 선생님들의 반례를 듣게 되었고, 그 반례를 고민하다가 완전수를 배제한 것을 알게 되었다..!

 

[최종코드]

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true) {

            int n = Integer.parseInt(br.readLine());
            int sum = 0;
            int count = 0;
            ArrayList<Integer> arr = new ArrayList<>();

            if (n == -1)
                break;

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

                if (n % i == 0 || n == 1)
                    arr.add(i);
            }

            for (int i = 0; i < arr.size(); i++) {

                sum += arr.get(i);
                count++;
            }

            if (sum == n) {

                System.out.print(n + " = " + arr.get(0));

                for (int j = 1 ; j < count; j++)
                    System.out.print(" + " + arr.get(j));
                System.out.println();
            }

            else
                System.out.println(n + " is NOT perfect.");

        }
    }
}

무야호

배운점

해당 문제를 꼼꼼히 읽는 습관을 가져야겠다고 생각 들었다!