[Java] 백준 9506번: 약수들의 합

hansung's·2024년 2월 25일
0

문제 url:
약수들의 합

문제:

🤔 문제 알아보기

  • 완전수라면 약수의 합을 나타내고 아니면 n is NOT perfect를 출력하는 문제
  • 약수를 구하는 문제이므로 약수를 먼저 구한 다음, 해당하는 값들의 합이 n과 같은지 비교한다.
  • 나중에 출력에 사용할 수 있도록 ArrayList 배열을 생성해 약수의 값들을 저장한 후 추후 출력시 사용할 수 있도록 한다.

😎 준비하기

1.BufferedReader를 사용하여 입력을 받는다.
2.N을 입력받는데, -1을 입력하면 끝나는 형태이므로 while문에 조건식을 이용해 반복 받도록 한다.
3. 약수들의 합과 약수를 담을 변수와 배열을 생성
4. N이 누적합과 같으면, 배열에 있는 값들을 불러와 출력
5. 그렇지 않으면 N is NOT perfect 출력

🐱‍👤 실제 코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));


        while(true) {
            StringBuilder sbd = new StringBuilder();
            int n = Integer.parseInt(br.readLine());
            int sum = 0;
            ArrayList<Integer> arr = new ArrayList<Integer>();

            // n에 -1을 입력하면 while문을 나오기 위함
            if(n == -1) {
                break;
            }
            // 약수들 합하기
            for(int i = 1; i < n; i++) {
                if (n % i ==0 ) {
                    sum += i;
                    arr.add(i);
                }
            }

            if(n == sum) {
                sbd.append(n).append(" = ");
                for(int i =0; i<arr.size(); i++) {
                    if (i != arr.size()-1) {
                        sbd.append(arr.get(i)).append(" + ");
                    } else {
                        sbd.append(arr.get(i));
                    }
                }
            } else {
                sbd.append(n).append(" is NOT perfect.");
            }
            System.out.println(sbd);
        }

    }
}

🤢 회고

특별히 어려운 것은 없었으나 조금 더 간결하게 풀 수 있는 방법이 없을까 많은 고민을 하다 너무 오래 걸려 그냥 해당 코드처럼 러프하게 짜보았다.
아직까지는 코드가 익숙하지 않은 모습인지. 거의다 하드코딩식이다.
그래서 반성의 의미로 다른 블로그에 있는 좋은 코드를 복기하며 리팩토링을 진행

😒 코드 리팩토링

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sbd = new StringBuilder();

        while(true) {
            int n = Integer.parseInt(br.readLine());

            // n이 -1을 입력받으면 종료
            if (n == -1) {
                break;
            }

            //배열에 약수를 저장할 배열 생성
            //이전에는 Array로 데이터 타입을 받았지만 이번에는 List로 받았다
            //인터페이스를 사용하여 변수를 선언하는 것이 좋은 방법으로 이는 코드의 유연성과 확장성을 향상
            //추상화를 통해 코드를 더 이해하기 쉽게 만들 수 있다.
            List<Integer> arr = getDivisor(n);
            if (arr == null) {
                sbd.append(n).append(" is Not perfect. \n");
                // 아래 코드를 동작하지 않게 하기 위해 continue 사용
                continue;
            }

            // 완전수일 경우 출력을 위한 문자열 초기화
            sbd.append(n).append(" = ");
            for (int i = 0; i < arr.size() - 1; i++) {
                sbd.append(arr.get(i)).append(" + ");
            }

            //마지막 인덱스에는 +를 붙이면 안되기 때문에 일찍 for문을 나온 다음 여기서 마지막 인덱스에 대한 출력 입력.
            sbd.append(arr.get(arr.size()-1)).append("\n");

        }
        System.out.println(sbd);

    }

    private static List<Integer> getDivisor(int n) {
        List<Integer> arr = new ArrayList<>();

        // 왜 먼저 1을 넣어줬는가?
        // 1은 어느 수이든 약수이며 제곱근까지 구하게 되는 아래 코드를 진행할 때 1부터 시작하면
        // 마지막 수도 포함되기 때문에, 그런 문제를 미리 방지하고자 먼저 정의
        arr.add(1);
        int sum = 1;

        // 약수들을 구할 때 n의 제곱근까지만 구한다.
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                arr.add(i);
                arr.add(n / i);
                sum += i + (n / i);
            }
        }

        if (sum != n) {
            return null;
        }
        Collections.sort(arr);
        return arr;

    }
}
profile
ABAPER를 꿈꾸는 개발자

0개의 댓글