백준/C++

[백준] 9506번: 약수들의 합 | C++ 풀이

성실한 당근농부 2023. 6. 8. 13:13

# 문제

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

 

 


 

# 풀이

크게 어렵지 않은 문제다. 문제에서 요구하는 대로 차근차근 진행해보자.

바로 정답 소스코드 확인!

 

#include <iostream>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(false); // 두 표준 입출력 동기화 해제
cin.tie(NULL); // 입력과 출력 묶음을 풀기
int n = 0;
while(1){
cin >> n;
if(n == -1) break;
vector<int> factor;
int perfect = 0;
for(int i=1; i<n; i++){
if(n%i == 0){
factor.push_back(i);
perfect += i;
}
}
if(perfect == n){
cout << n << " = ";
for(int i=0; i < factor.size()-1; i++){
cout << factor[i] << " + ";
}
cout << factor[factor.size()-1] << '\n';
} else cout << n << " is NOT perfect." << '\n';
}
return 0;
}

우선 테스트 케이스는 입력으로 -1이 들어올 때까지 끝나지 않으므로 무한루프 while문으로 처리하고 -1이 입력으로 들어올 경우 break를 통해 반복을 중단해주었다.

 

 

 

vector<int> factor;
int perfect = 0;
for(int i=1; i<n; i++){
if(n%i == 0){
factor.push_back(i);
perfect += i;
}
}

지난 번 2501번 풀이 글과 같이 약수의 개수를 모르기 때문에 동적 크기 조정이 가능한 vector로 약수를 담을 공간을 만들어주었다.

그리고 이번엔 완전수인지 아닌지 체크도 해주어야 하기 때문에 n 자신까지는 체크하지 않도록 for문을 처리했고, 약수를 구함과 동시에 perfect 변수에 더해주었다.

 

 

 

if(perfect == n){
cout << n << " = ";
for(int i=0; i < factor.size()-1; i++){
cout << factor[i] << " + ";
}
cout << factor[factor.size()-1] << '\n';
} else cout << n << " is NOT perfect." << '\n';

만약 위에서 구한 perfect가 n과 같으면 해당 수는 완전수이므로 오름차순으로 문제에서 요구하는 방식대로 출력, 완전수가 아니라면 else문으로 완전수가 아님을 출력해주었다. 끝!

 

 

 

 

 


 

 

 

9506번: 약수들의 합

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

www.acmicpc.net

 

728x90