문제 내용
- 자연수 N이 입력되면 1부터 N까지의 각 숫자들의 약수의 개수를 출력하는 프로그램을 작성하
세요.
- 만약 N이 8이 입력된다면 1(1개), 2(2개), 3(2개), 4(3개), 5(2개), 6(4개), 7(2개), 8(4 개) 와 같이 각 숫자의 약수의 개수가 구해집니다.
- 출력은 다음과 같이 1부터 차례대로 약수의 개수만 출력하면 됩니다.
- 8 -> 1 2 2 3 2 4 2 4
입출력
- 첫 번째 줄에 자연수 N(5<=N<=50,000)가 주어진다.
- 첫 번째 줄에 1부터 N까지 약수의 개수를 순서대로 출력한다.
구현 방식
- 맨처음에 간단하게 생각할 수 있는 방식은 1 -> N 까지 하나하나 다 약수를 구하는데, 하나의 수의 약수를 구할때 for 문을 돌면서 i % j == 0 것을 카운트 하는 것이다.
- 해당 문제는 자연수가 50000 까지 가므로 O(n^2) 방식으로 가면, 최대 연산량이 10^9 제곱까지 가버려서 1초가 넘게된다.
- 10^9 –> 1억 –> 1초
- 2^30 –> 약 1억 –> 1초
- 생각을 바꿔서, i 를 배수를 가지는 숫자의 약수를 늘려주는 방식으로 진행한다.
vector<int> counter;
void solution(int input ){
counter = vector<int>(input + 1, 0);
for (int i = 1; i <= input; i++)
{
for (int j = i; j <= input; j = j + i)
{
counter[j]++;
}
}
for (int i = 1; i <= input; i++)
cout << counter[i] << " ";
}