알고리즘/SW Expert Academy
8567. 약수의 개수가 많은 수
혬혬
2020. 1. 7. 21:01
728x90
이 문제에 오버타임에 대한 댓글이 있어서 데이터량이 큰 것을 알았다. 또한. 이 문제의 경우에는 테스트 케이스 수에 대한 정보도 없어서 테스트 케이스가 얼마나 많이 들어올지도 모른다는 것이다.
그래서 첫 번째로 생각한 솔류션은
list 배열에 각 인덱스에 대응하는 약수 개수를 저장해놓고 처음부터 각 값까지 max값을 계산해였다.
하지만, 이 경우, 문제 자체의 개수도 많았기에 5개뿐이 맞추지 못했다.
그래서 새로운 솔류션을 생각했다.
list 배열에 차원을 하나 더 늘려 그 숫자까지의 max 값을 저장하는 것이었다.
그렇게 되면 처음 약수의 개수를 찾는 for문과 그 숫자까지의 max 값을 찾는 for문을 이용하여 값을 빠르게 찾을 수 있다.
시간복잡도는 100000(약수 개수 찾기)+100000(max 값 찾기)+N(문제의 개수). 즉, 선형시간에 가능하다
#include<stdio.h>
int list[100001][2] = { 0 };
int main(void) {
freopen("inp.inp", "r", stdin);
freopen("out.out", "w", stdout);
int k = 0;
for (int i = 1; i < 100001; i++) {
k = i;
while (k < 100001)
{
list[k][0]++;
k += i;
}
}
int max = 0;
int max_value = 0;
for (int i = 1; i < 100001; i++) {
if (max_value <= list[i][0]) {
max = i;
max_value = list[i][0];
}
list[i][1] = max;
}
int ts = 0;
scanf("%d", &ts);
int number = 0;
for (int q = 0; q < ts; q++) {
scanf("%d", &number);
printf("#%d %d\n", q + 1, list[number][1]);
}
return 0;
}
728x90