백준/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