728x90
[목적]
자연수 N을 입력하면 1부터 N까지의 숫자들의 약수의 개수를 출력한다.
[입력 예제]
8
[출력 예제]
1 2 2 3 2 4 2 4
8을 입력하면 1부터 8까지의 숫자들의 약수의 개수를 출력한다.
이때 제한시간은 1초안에 출력 될 수 있도록 한다.
[코드 1]
#include <iostream>
using namespace std;
int main(void) {
int num, cnt = 0;
cin >> num;
for(int i=1; i<=num; i++){
cnt = 0;
for(int j=1; j<=i; j++){
if(i%j == 0)
cnt++;
}
cout << cnt << " ";
}
return 0;
}
[실행 결과 1]
마지막 경우에서 시간초과가 나왔다. 항상 1부터 끝까지 돌아야 하기에 시간 복잡도가 거의 N^2에 가까워서 그렇다고 한다.
[코드 2]
#include <iostream>
using namespace std;
int main(void) {
int num;
int cnt[50001] = {0};
cin >> num;
for(int i=1; i<=num; i++){
// j가 i부터 시작해서 i의 배수들만 개수를 1씩 늘려준다.
for(int j=i; j<=num; j=j+i){
cnt[j]++;
}
}
for(int i=1; i<= num; i++){
cout << cnt[i] << " ";
}
return 0;
}
1. 1부터 N까지의 수의 N을 입력받는다.
2. 1부터 N까지 반복하며 반복문 안에서 i부터 N까지 반복한다.
3. 이중 for문 안의 for문에서 i의 배수들만 cnt[j] 배열안의 숫자를 1씩 늘려준다.
4. cnt배열을 출력한다.
[실행 결과 2]
728x90
반응형
'문제풀이 > C++' 카테고리의 다른 글
[C++] 숫자의 총 개수 (small) (0) | 2020.12.29 |
---|---|
[C++] 자릿수의 합 (0) | 2020.12.28 |
[C++] 올바른 괄호 (0) | 2020.12.27 |
[C++] 영어단어 복구 (0) | 2020.12.27 |
[C++] 숫자만 추출 (0) | 2020.12.27 |