백준 9506 약수들의 합 [JAVA]

Ga0·2023년 3월 23일
0

baekjoon

목록 보기
5/123

  • 오늘 포스트할 문제는 9506번 - 약수들의 합 문제 이다.

문제 해석

이 문제는 두가지의 경우의 수로 나눌 수 있다.

  • 자연수를 입력받는다. (여기서 자연수는 입력받는 수로 n을 의미한다)
    1) 자기자신(n)을 제외한 모든 약수(n을 어떠한 수로 나눴을 때 나머지가 0인 값)의 합이 입력받은 수, 즉 자기자신(n)이 나오는 경우에 n =약수 + 약수 + 약수 ... 이런 식으로 출력한다.
    2) 만약, 모든 약수를 더했는데 자기자신(n)이 나오지 않는다면 n is NOT perfect. 을 출력한다.

내가 짠 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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

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

            if(n == -1){
                break;
            }

            sb.append(n);

            int [] array = new int[n];

            int sum = 0;
            for(int i =1; i <= n; i++){
                if(n%i == 0){
                    array[i-1] = i;
                    sum += i;
                }
                //차피 아니면 0이 들어감(약수는 0이 나올 수 X)
            }

            if(sum == n){
                sb.append(" = ");

                for(int i = 0; i < n; i++){
                    if(array[i] != 0){
                        sb.append(i);
                    }
                    if(i < n){

                    }
                }
                sb.append("\n");
            }else{
                sb.append(" is NOT perfect. \n");
            }
        }
        br.close();
    }

}
  • 코드 로직 자체는 거의 다 짠 것 같은데 출력해야하는 형식이 아래 사진과 같아서 StringBuilder로 어떻게 하면 "+" 를 적절하게 넣을 수 있을까 고민하다가 해답을 찾지 못해 다른 사람 코드를 참고 했다. (보통 다른사람의 코드를 참고하게 되면 포스트를 하려고 하기 때문에 포스트 하게 됨)

해답 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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

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

            if (n == -1) {
                break;
            }

            int[] array = new int[n];

            int sum = 0;

            for (int i = 1; i <= n; i++) {
                if (n % i == 0 && i != n) {
                    array[i] = i;
                    sum += i;
                }
                //차피 아니면 0이 들어감(약수는 0이 나올 수 X)
            }

            //완전수가 아닐 경우
            if (sum != n) { //다른 것과 구분하려면 앞으로 빼는 것이 나음!
                sb.append(n+ " is NOT perfect. \n");
                continue; //완전수가 아니기때문에 밑의 코드는 수행 X
            }

            sb.append(n + " = 1"); //1의 약수는 차피 무조건 추가  이기 때문에

            for(int i = 1; i <= n; i++){ //약수의 최대 몇개 인지 알고 있기 때문에 index만큼 반복문
                if(array[i-1] != 0 && array[i-1] != 1){ //숫자 출력 부분 1출력은 생략한다.
                    sb.append(" + " + array[i-1]);
                }

            }
            sb.append("\n");

        }
        br.close();
        System.out.println(sb);
    }

}
  • 위의 코드는 다른 사람이 짠 코드를 해석해서 내 방식대로 짠코드인데 생각보다 더럽게 짠 느낌이라 출력하는 것에 어려움이 있었다.
  • 코드는 주석으로 설명을 해두었지만, 처음 짠 코드와 다른 점은,
    1) if문의 위치와 조건문이다. 완전수가 아닌 경우의 조건문을 앞으로 빼서, 밑의 코드는 수행을 하지않도록 하였다.
    2) 완전수일 경우 초기값을 주었다는 점이 내 코드와 달랐다. sb.append(n + " = 1")을 기본값으로 주고 조건문에 1인 아닌 경우를 추가하여 " + 1 " 형식으로 출력하였다.

    결과


느낀점

  • 아직 출력하는 것에 대해서 생각하지 못한 부분이 있어 부족함을 많이 느꼈다.
  • 그리고 정답을 보고 코드를 짜도 내 코드가 더럽게 짜여진 느낌이라서 아쉬움을 많이 느꼈다.
  • 출력빼고는 크게 어려움이 없던 문제였기 때문에 사실 이 문제에 대한 느낀점이 많지 않지만 자기반성을 좀 많이 했다.
  • 그니까... 내 자신 파이팅...!

0개의 댓글