성장일기

내가 보려고 정리하는 공부기록

코딩테스트/백준 브론즈,실버

[백준] 9506 : 약수들의 합 (List 활용) - JAVA

와나나나 2024. 1. 23. 00:24
728x90

백준 단계별 문제풀이 9단계 (약수, 배수와 소수)

https://www.acmicpc.net/problem/9506

 

9506번: 약수들의 합

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다. 예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다. n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

www.acmicpc.net

 

 

# 문제

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.

예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.

n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

 

# 예제

입력 : (2 < n < 100,000), 입력의 마지막엔 -1이 주어진다.

6
12
28
-1

 

출력

6 = 1 + 2 + 3
12 is NOT perfect.
28 = 1 + 2 + 4 + 7 + 14

 

# 필요개념

이 문제는 입력받은 수의 약수 중 자신을 제외한 수의 합을 구해 비교하고, 같으면 약수들을 뽑아내야 한다. 따라서 입력받은 수의 약수를 어딘가에 보관해야 한다는 뜻이다. 배열에 넣어도 되지만, 오랜만에 리스트를 사용하고 싶어서 써봤다!

 

✅ 리스트 메소드

 

내가 해당 문제에서 쓴 리스트의 메소드는 3개이다.

메소드 설명
add(obj o) 객체 o를 리스트에 넣음
get(idx i) i번째 원소의 값을 반환, 삭제 안 됨
clear() 리스트를 null로 초기화함

 

이정도만 알아도 충분히 사용 가능하다. 

추가로 while문을 사용할 때에는 break 조건을 꼭!! 신경써서 명시해야한다. (잘못하면 무한루프에 걸린다)

 

# Code

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args)  {
        Scanner sc = new Scanner(System.in);
        List<Integer> lst = new ArrayList<>();

        while(true) {
            int a = sc.nextInt();
            int sum = 0;
            if (a == -1) break;

            for (int i = 1; i < a ; i++) {
                if (a % i == 0) {
                    lst.add(i);
                    sum += i;
                }
            }

            if (sum == a) {
                System.out.print(a + " = ");
                for (int j = 0 ; j < lst.size() ; j++) {
                    if (j == lst.size() - 1) System.out.println(lst.get(j));
                    else System.out.print(lst.get(j) + " + ");
                }
            }
            else System.out.println(a + " is NOT perfect.");
            lst.clear();

        }

    }
}

 

print와 println을 용도에 맞게 눈치껏 사용해야한다는 거 잊지 말기 ..!

 

 

# 결과