반응형
알고리즘 종류
- 투 포인터
- 에라토스테네스의 체
사고 과정
1. 에라토스테네스의 체로 소수만 선별하기
2. 선별된 소수 배열에 투 포인터
구현(C++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int num;
int answer = 0;
vector<bool> check;
vector<int> primes;
int main(void){
cin >> num;
check.resize(num+1, true);
// 에라토스테네스의 체
for(int i=2; i<=sqrt(num); i++){
if(!check[i]) continue;
for(int j=i*i; j<=num; j+=i){
check[j] = false;
}
}
// 소수 값만 옮겨서 저장
for(int i=2; i<=num; i++){
if(check[i]) primes.push_back(i);
}
// 투 포인터
int left=0, right=0;
int sum=2;
while(left <= right && right < primes.size()){
if(sum == num) {
answer ++;
sum -= primes[left];
left++;
}
else if(sum < num){
right++;
sum += primes[right];
}
else if(sum > num){
sum -= primes[left];
left++;
}
}
cout << answer << endl;
}
|
cs |
시행착오
- 에라토스테네스의 체를 함수로 만들어서 모든 수를 소수로 판별하는 용도로 사용했다. 그래서 입력된 값에 대한 것만 진행하면 시간복잡도가 log log n인데 n개를 모두 해서 n log log n으로 시간이 크게 되었다. 너무 느리다는 것을 다른 사람들과 비교해보고 수정했다.
반응형
'코딩 공부 > 백준' 카테고리의 다른 글
[백준][C++] 1504 특정한 최단 경로 (0) | 2021.02.14 |
---|---|
[백준][C++] 1300 k번째 수 (0) | 2021.02.13 |
[백준][C++] 16927 배열 돌리기 2 (0) | 2021.02.12 |
[백준][C++] 16926 배열 돌리기 1 (0) | 2021.02.11 |
[백준][C++] 2437 저울 (0) | 2021.02.08 |