1. 1만 이하의 완전수는 4개 뿐이다.

2. 과잉수와 부족수를 구하면 된다.

3. 시간을 줄이려면 소수들을 구해서 뭔가 하면 될 것 같은데, 굳이 그럴 필요가 없다. (1 <= T < 1000)

4. 그래서 하나씩 다 구했다.

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/14563
* BOJ 백준온라인져지 14563 완전수 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String str1[] = br.readLine().split(" ");
for (int i = 0; i < N; i++) {
int n = Integer.parseInt(str1[i]);
switch (n) {
case 6:
case 28:
case 496:
case 8128:
bw.write("Perfect\n");
break;
default:
int r = 0;
for (int j = 1; j <= n / 2; j++) {
if (n % j == 0) r += j;
}
if (r < n) bw.write("Deficient\n");
else bw.write("Abundant\n");
break;
}
}
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

어떠한 자연수 N에 대해서 N을 제외한 약수(진약수)의 합이 N이 되는 자연수를 완전수라고 한다. 예를 들어, 6의 약수는 1, 2, 3, 6인데 1+2+3은 6이기 때문에 완전수이다. 또 진약수의 합이 자기 자신보다 작은 경우를 부족수, 진약수의 합이 자기 자신보다 큰 경우를 과잉수라고 한다.

이 때, 어떤 수가 주어질 때 이 수가 완전수인지, 부족수인지, 과잉수인지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 자연수의 개수 T가 주어진다. T은 1000보다 작은 수이다.

둘째 줄에는 공백을 사이에 두고 완전수인지 구해야 되는 자연수 N이 주어진다.(N<10000)

출력

T개 줄에 걸쳐서 각 자연수에 대해서 완전수면 ‘Perfect’, 부족수면 ‘Deficient’, 과잉수면 ‘Abundant’를 출력한다.

예제 입력 1 

3
28 21 36

예제 출력 1 

Perfect
Deficient
Abundant

힌트

28의 경우 약수가 1, 2, 4, 7, 14, 28 이고, 1+2+4+7+14=28이기 때문에 완전수이다.

21의 경우 약수가 1, 3, 7, 21 이고, 1+3+7=11<21이기 때문에 부족수이다.

36의 경우 약수가 1, 2, 3, 4, 6, 9, 12, 18, 36 이고, 1+2+3+4+6+9+12+18=55>36이기 때문에 과잉수 이다.


+ Recent posts