일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- dp
- 다이나믹프로그래밍
- 슬픔
- 머신러닝
- mmdetection
- 라즈베리파이
- 파이썬 강의
- 파이썬
- 계획
- 알고리즘
- 공부
- 자작시
- python 강좌
- 파이썬 강좌
- dynamic programming
- it
- 백준
- python 강의
- 2021
- 라즈베리파이 모니터
- python
- 프로그래밍
- C++
- 철학
- mmcv
- 2020
- 강좌
- BOJ
- 라즈베리파이3
- 강의
Archives
- Today
- Total
Stargazer
[백준] 1644번: 소수의 연속합 c++ 풀이 (에라토스테네스의 체, 투 포인터) 본문
Undergraudate basics(학부생 기초)/자료구조, 알고리즘
[백준] 1644번: 소수의 연속합 c++ 풀이 (에라토스테네스의 체, 투 포인터)
COM2IT 2022. 6. 25. 16:02반응형
접근:
어떤 자연수가 주어지면 그것보다는 작은 소수의 합의 갯수를 구하는 것이므로,
n보다 작은 소수의 배열을 구하고, 그에 맞는 구간 합을 구하면 된다.
전략:
소수를 구하는 것은 에라스토테네스의 체를 이용하여 구하면 되고,
구간합은 투 포인터(two pointers)를 이용하여 구하면 된다.
코드:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector<int> sosu; //n이하 소수 배열
bool so[4000001]; //소수 판별 배열
int n;
int sum = 0;
int s = 0, e = 0;
int res = 0;
int main(){
cin >> n;
for(int i=2;i<=n;i++){
if(!so[i]){ //소수면
sosu.push_back(i);
for(int j=1; j*i <= n; j++){ //배수 삭제
so[j*i] = true;
}
}
}
sum = 0;
s=0, e=0;
while(s<=e){ //2 pointer
if(sum > n){
sum -= sosu[s++];
}
else if(sum < n){
if(e >= sosu.size()) break;
sum += sosu[e++];
}
else{
res++;
if(e >= sosu.size()) break;
sum += sosu[e++];
}
}
cout << res << '\n';
return 0;
}
반응형
'Undergraudate basics(학부생 기초) > 자료구조, 알고리즘' 카테고리의 다른 글
[백준] 2252번 : 줄 세우기 C++ (위상정렬) (0) | 2022.07.05 |
---|---|
[백준] 2239번: 스도쿠 C++ (백트래킹) (0) | 2022.07.04 |
[백준] 1305번 : 광고 (KMP 알고리즘) c++ 풀이 (0) | 2022.05.29 |
[백준] 1202번 : 보석 도둑 (그리디 알고리즘) C++ 풀이 (0) | 2022.05.20 |
[백준] 1007번: 벡터 매칭 (수학) c++ 풀이 (0) | 2022.05.20 |
Comments