첫번째 시도는 "시간 초과"였다.
#include <iostream>
using namespace std;
int main() {
int T;
cin >> T;
int arr[T];
for(int i=0; i<T; i++)
cin >> arr[i];
for(int i=0; i<T; i++) {
int sum_g = 0;
for(int j=1; j<=arr[i]; j++) {
int sum_f = 0;
for(int k=1; k<=j/2; k++) {
if(j%k==0)
sum_f += k;
}
sum_g += sum_f;
}
cout << sum_g << "\n";
}
return 0;
}
시간 복잡도 오류를 해결해야 했다.
3중 for문을 사용하지 않기 위해 여러 방식으로 코드를 고쳐봤지만 그래도 연산을 줄이지 못했다.
#include <iostream>
using namespace std;
int main() {
//입력 받기
int T;
cin >> T;
int arr[T];
for(int i=0; i<T; i++)
cin >> arr[i];
// f(A)값, 1부터 1,000,000까지 각 약수의 총합 구해 저장
int f[1000001];
for(int i=1; i<=1000000; i++) {
int sum_f = 0;
for(int j=1; j<=i/2; i++) {
if(i%j==0)
sum_f += j;
}
f[i] = sum_f;
}
// g(A)값 구해 출력
for(int i=0; i<T; i++) {
int sum_g = 0;
for(int j=1; j<=arr[i]; j++) {
sum_g += f[j];
}
cout << sum_g << "\n";
}
return 0;
}
다른 사람들의 코드를 통해 시간 복잡도 문제를 해결해보았다.
약수 n은 n의 배수들이에게 나타남을 이용해 간단한 코드를 만드는 것이다.
마지막에 '앞에 수까지의 모든 약수 합' 을 더해준다.
이렇게 배열에 각 g값을 저장해두고 마지막에 출력만 해주면 된다.
// g값 계산하기
for(int i=1; i<1000001; i++) {
for(int j=i; j<1000001; j+=i){
sum_g[j] += i;
}
sum_g[i] += sum_g[i-1];
}
'백준' 카테고리의 다른 글
백준 2229번: 조 짜기, c++ (0) | 2024.02.17 |
---|---|
백준 1715 카드 정렬하기, c++ (0) | 2024.02.15 |
백준 1038번: 감소하는 수, c++ (0) | 2024.02.02 |
백준 2447번: 별 찍기 - 10, c++ (0) | 2024.01.31 |
백준 2493번: 탑, c++ (0) | 2024.01.30 |