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(); | |
} | |
} |
문제
어떠한 자연수 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이기 때문에 과잉수 이다.
출처
University > 중앙대학교 > CodeRace 2017 C번
'IT > 알고리즘' 카테고리의 다른 글
BOJ 백준온라인져지 10820 문자열 분석 풀이 (0) | 2018.05.21 |
---|---|
BOJ 백준온라인져지 12785 토쟁이의 등굣길 풀이 (0) | 2018.05.21 |
BOJ 백준온라인져지 5533 유니크 풀이 (0) | 2018.05.18 |
BOJ 백준온라인져지 3184 양 풀이 (0) | 2018.05.17 |
BOJ 백준온라인져지 3020 개똥벌레 풀이 (0) | 2018.05.17 |