[C++] 백준 9506 - 약수들의 합

메르센고수·2023년 8월 12일
0

Baekjoon

목록 보기
13/48

문제 - 약수들의 합 (Bronze 1)

풀이 전략

  • 완전수 = 자기 자신을 제외한 약수들의 합
    -> 따라서 자기 자신을 제외하고 반복문을 돌려서 약수이면 배열에 저장을 한 뒤, 저장했던 배열을 다시 반복문을 돌려서 sum==num 이면 출력하고, 그렇지 않으면 NOT perfect를 출력
  • 1+2+3의 경우, 반복문과 조건문을 섞어서 해야함 (cout<<A[i]<<" + ";로 하게 되면 맨 마지막에 불필요한 +가 한번 더 출력되기 때문)

소스 코드

#include <iostream>
#include <vector>
using namespace std;

int main(void){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    vector<int> A;
    int num;

    while(1){
        cin>>num;
        if(num==-1){
            break;
        }
        for(int i=1;i<num;i++){
            if(num%i==0){
                A.push_back(i);
            } // i가 num의 약수이면 A에 저장
        }
        int sum=0;
        for(int i=0;i<A.size();i++){
            sum+=A[i];
        } // A의 원소 개수만큼 반복문을 돌려서 모든 원소의 합을 sum에 저장
        if(sum==num){
            cout<<num<<" = ";
            for(int j=0;j<A.size();j++){
                cout<<A[j];
                if(j<A.size()-1){
                    cout<<" + ";
                } // 맨 마지막에 불필요한 +의 출력을 막기 위함
            }
            cout<<'\n';
        }else{
            cout<<num<<" is NOT perfect."<<'\n';
        }
        A.clear(); 
        // ex) 현재 6의 약수들이 A에 들어가 있기 때문에 다른 완전수(28)의 약수들을 저장하기 위해 초기화
        // A.clear(); 를 선언하지 않으면 28을 입력했을 때 28 is NOT perfect가 출력됨
    }
}

결과

profile
블로그 이전했습니다 (https://phj6724.tistory.com/)

1개의 댓글

comment-user-thumbnail
2023년 8월 12일

좋은 정보 감사합니다

답글 달기