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

 

이전꺼의 제목이 약수였는데 왠지 모르게 2가 나왔다 

이 문제 다음순서는 1이다 왜?

 

아무튼 이번문제는 어떤 수의 약수들의 합을 구하고

1 ~ 어떤 수 까지의 약수들의 합을 다 더하는 문제다

 

문제에서 어떻게 하라고 적어있기에 그대로 역시 기초문제는 간단해서 좋다라며 코드로 적었건만...

시간초과로 틀렸다

// 시간초과나서 틀린 코드!


/// x의 모든 약수의 합값을 반환하는 함수
int f(int x) {
    int sum = 1 + x;
    int stop = x;
    for (int i = 2; i < stop; i ++) {
        if (x % i == 0) {
            sum += i;
            stop = x / i;
            sum += stop;
        }
    }
    return sum;
}

/// 주어진 x 이하의 모든 자연수값을 f(x)에 넣고 더한값을 반환하는 함수
int g(int x) {
    int sum = 1;
    for (int i = x; i > 1; i --) {
        sum += f(i);
    }
    return sum;
}

 

나름 깔끔히 잘했다고 생각했는데, 뭐 아무튼 검색좀 해보니 이런 문제는 에라토스테네스의 채 라는 별명의 가진 알고리즘으로 구현해야한다고 한다

무슨 이름이 이런가 했더니 내용보니 아 왠지 모르게 이런거 했었던 어렴풋한 기억이 난다

그런 기억이 있는거보면 꽤나 유명한모양?

 

뭐 아무튼 그래서 이 방법대로 전체를 더한 배열을 만들고

그 배열에서 더할걸 골라서 다 더한다

그리고 그냥 int도 아닌 long long~ 그렇게까지 큰범위를 다뤄야 하나 싶지만 예시가 Long으로 나와서 따라했다 

#define MAX 1000000

long long f[MAX + 1];

long long solution(int n) {
    // 각 i의 배수들의 합을 f배열에 저장
    for (int i = 1; i <= n; i ++) {
        for (int j = i; j <= n; j += i) {
            f[j] += i;
        }
    }
    
    // f[1] ~ f[n] 까지의 합
    long long g = 0;
    for (int i = 1; i <= n; i++) {
        g += f[i];
    }
    return g;
}

 

뭐 아무튼 그렇게 통과.

 

몇 문제 안풀어봤지만 백준문제들은 범위내에 미리 만들어두고 뽑아내는걸 좋아하는거 같기도하고?

 

 

 

https://github.com/wiwi-git/c-baekjoon

 

GitHub - wiwi-git/c-baekjoon: 블로그 업데이트용 백준 코드

블로그 업데이트용 백준 코드. Contribute to wiwi-git/c-baekjoon development by creating an account on GitHub.

github.com

 

 

반응형

'C,C++' 카테고리의 다른 글

[C]백준 Q.2609,1978,1929 최대공약수 ~ 소수 문제  (0) 2025.12.18
[C]백준 Q.17425 약수의 합 1  (0) 2025.12.14
[C]백준 Q.1037 약수  (0) 2025.12.12
[C]백준 Q.4375 1  (0) 2025.12.11
[C]백준 Q.2839 설탕 배달  (0) 2025.12.07

+ Recent posts