프로그래밍/알고리즘 PS

[C++] BOJ 9506번: 약수들의 합

코딩 제이티 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;
}

 

결과