ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] BOJ 9506번: 약수들의 합
    프로그래밍/알고리즘 PS 2024. 3. 28. 13:52

    학교에서 진행하는 수업에서 같이 듣는 팀원이 공유한 알고리즘 문제를 풀어보았다. 문제의 난이도는 브론즈 1으로, 빠르게 풀 수 있을 거라 생각했지만 출력을 적절하게 하도록 코드를 작성하는 데에 예상보다 시간이 걸렸다.

    문제 링크

    https://www.acmicpc.net/problem/9506

    문제 분석

    해당 문제는 완전수를 찾는 문제이다. 완전수란 자기 자신을 제외한 모든 약수를 더했을 때 자기 자신과 같은 값이 나오는 수를 의미한다. n이 완전수가 아님이 판별되면 n is NOT perfect.를 출력한다. n이 완전수일 경우 n을 약수들의 합으로 표현해야 하는데, 이 부분에서 코드가 길어졌다.

    문제 풀이

    먼저 주어진 숫자 n의 약수를 구하는 법을 판단해보자. 어떤 수 k가 있을 때, n % k == 0이라면 k는 n의 약수이다.

    이에 따라 n 자기 자신을 제외한 n의 모든 약수를 처리하는 코드는 다음과 같아진다.

    for(int i=1; i<n; i++)
        if(n % i == 0) // i는 n의 약수일 경우

    위의 if문 내에서 약수 i를 처리하면 된다.

    n이 완전수일 경우 출력이 6 = 1 + 2 + 3과 같은 형태로 출력되어야 하므로 n의 약수를 담아둘 배열이 필요하다. 따라서 아래와 같이 배열을 선언한다.

    int factors[100000] = {
        0,
    };
    int factor_size = 0;

    배열 factors의 크기가 100000인 이유는 문제에서 n의 최대값이 100000이 될 수 없다고 나와 있기 때문이다. factor_sizefactors 배열에 담긴 약수의 갯수를 저장하는 변수이다.

    int sum = 0;
    for (int i = 1; i < n; i++)
    {
        if (n % i == 0)
        {
            sum += i;
            factors[factor_size++] = i;
        }
    }

    위 코드는 해당 수가 완전수인지 비교하기 위해 약수의 값을 모두 더하고, 약수들을 factors 배열에 저장해두는 코드이다. 만약 계산 결과 sum == n이면 완전수에 해당하며, sum != n이면 n이 완전수가 아니다.

    먼저 sum != n인 경우 아래와 같은 코드로 결과를 출력한다.

    cout << n << " is NOT perfect." << '\n';

    그리고 sum == n인 경우 factors 배열에 저장한 약수들을 이용해 결과를 출력한다.

    cout << n << " = ";
    for (int i = 0; i < factor_size; i++)
    {
        cout << factors[i];
        if (i != factor_size - 1)
            cout << " + ";
    }
    cout << '\n';

    전체 코드

    위의 코드를 종합해 작성한 전체 코드는 다음과 같다.

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void solution(int n)
    {
        int sum = 0;
        int factors[100000] = {
            0,
        };
        int factor_size = 0;
    
        for (int i = 1; i < n; i++)
        {
            if (n % i == 0)
            {
                sum += i;
                factors[factor_size++] = i;
            }
        }
    
        if (sum == n)
        {
            cout << n << " = ";
            for (int i = 0; i < factor_size; i++)
            {
                cout << factors[i];
                if (i != factor_size - 1)
                    cout << " + ";
            }
            cout << '\n';
        }
        else
        {
            cout << n << " is NOT perfect." << '\n';
        }
    }
    
    int main(void)
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
    
        while (true)
        {
            cin >> n;
            if (n == -1)
                break;
            solution(n);
        }
    
        return 0;
    }

     

    결과

Designed by Tistory.