백준 알고리즘 단계별로 풀어보기/약수, 배수와 소수

백준 9506번 약수들의 합 (C언어)

MNMNWVWV 2023. 3. 5. 22:40
728x90
반응형
브론즈Ⅰ

 

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

 

9506번: 약수들의 합

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

www.acmicpc.net

 

 

풀이 방법

 

n을 입력받고 1부터 n-1까지(자기 자신을 제외한 모든 약수들을 구해야 하므로)의 수 중 n의 약수를 찾기위해 for문을 이용해 i에 1부터 n-1까지 대입한다.

 

만약 n%i(n을 i로 나눈 나머지)가 0일 경우(i가 n의 약수일 경우) 배열에 그 수를 저장하고 n의 약수의 개수를 셀 cnt를 1 증가시킨다. 또한, n이 완전수인지를 판단해야 되기 때문에 sum에 약수 i를 더해준다.

 

이후 n이 약수들의 합 sum과 같다면 그에 맞는 주어진 출력형식(n = 약수 + 약수 + ... + 약수)대로 출력하고, n이 약수들의 합 sum과 다르다면 그에 맞는 주어진 출력형식(n is NOT perfect)대로 출력한다.

내 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#pragma warning(disable:4996)
#include <stdio.h>
 
int main(void) {
    
    int n, i, j, cnt, sum, arr[100000= {0};
 
    while (1) {
        cnt = 0, sum = 0;
        scanf("%d"&n);
        if (n == -1)
            return 0;
 
        for (i = 1, j = 0; i < n; ++i) {
            if (n % i == 0) { //i가 n의 약수라면
                arr[j++= i;
                ++cnt;
                sum += i;
            }
        }
        
        if (n == sum) {
            printf("%d = %d", n, arr[0]);
            for (i = 1; i < cnt; ++i) {
                printf(" + %d", arr[i]);
            }
            printf("\n");
        }
        else
            printf("%d is NOT perfect.\n", n);
 
    }
 
    return 0;
}
 
cs
 

 

코드설명

 

1   | scanf 함수를 사용할 때 경고창을 띄우지 않도록 하는 전처리 지시문이다.

2   | scanf, printf 함수를 사용하기 위한 전처리 지시문이다.

6   | 각각의 변수를 다음의 용도로 정의하였다.

        // i : for문에서 사용하기 위해

        // j : j번째 배열에 약수 i를 넣기 위한 변수이다.

        // cnt: 약수의 개수를 저장하기 위해(배열의 길이를 저장하기 위해)

        // sum : 약수의 합을 저장하기 위해

        // arr[] : 약수를 저장하기 위해

9  | 새로운 n을 입력받을때마다 약수의 개수와 약수의 합을 초기화하기 위해

22~28 |  n이 완전수일때 주어진 형식대로 출력을 하는 코드이다.

29~32 | n이 완전수가 아닐 때 주어진 형식대로 출력을 하는 코드이다.

반응형
느낀점

 

- 배열의 크기를 100,000으로 지정했지만, 더 작게 지정해도 될 것 같다. 파이썬 같은 언어를 사용했다면 배열의 원소를 하나씩 추가하면 되기 때문에 더 쉽게 작은 크기의 배열로 문제를 풀었을 것이다.

- 배열을 이용하지 않고, 출력할 때 for문으로 다시 약수를 구하는 방법도 있다.

- 약수를 구할 줄 안다면 크게 어려운 점은 없는 것 같다.

728x90
반응형