코테/백준
9506번 약수들의 합
jhss9747
2025. 2. 6. 14:01
https://www.acmicpc.net/problem/9506
문제
어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.
예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.
n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.
출력
테스트케이스 마다 한줄에 하나씩 출력해야 한다.
n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).
이때, 약수들은 오름차순으로 나열해야 한다.
n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.
풀이
2025.02.06 - [코테/백준] - 2501: 약수 구하기
2501: 약수 구하기
https://www.acmicpc.net/problem/2501문제어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다. 6을 예로 들면6 ÷ 1 = 6 … 06 ÷ 2 = 3 … 06 ÷ 3 = 2 … 06 ÷ 4 = 1 … 26 ÷ 5 = 1
jhss9747.tistory.com
이전에 풀었던 약수 구하기 문제의 응용버전이다.
위 문제에서 풀었듯이 n의 약수를 먼저 구하고, 약수를 모두 더한 값이 n과 같다면 합을 출력한다.
- while문으로 무한 반복하며, n을 입력받고 n이 -1이라면 멈춘다.
- 완전수는 n 자기자신을 제외한 모든 약수의 합이므로 n/2 의 값 만큼 for문을 반복한다.
- 만약 약수라면 result 문자열에 형식에 맞춰 약수를 추가하고, sum에 값을 더한다.
- for문이 끝나고 result의 마지막에 불필요한 ' + ' 를 제거한다.
- if문으로 n과 sum값이 같은지 확인하여 같다면 result를 출력한다.
- 같지 않다면 n is NOT perfect. 를 반환한다.
아래와 같이 코드로 구현하였다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n ,sum;
String result;
while(true){
n = sc.nextInt();
sum = 0;
result = " = ";
if (n == -1) break;
for (int i = 1; i <= n/2; i++) {
if(n%i == 0){
result = result + i + " + ";
sum += i;
}
}
result = result.substring(0, result.length()-3);
if (sum == n) {
System.out.println(n + result);
} else{
System.out.println(n + " is NOT perfect.");
}
}
}
}