티스토리 뷰
[BOJ 1644(G3)리뷰]
지난 문제에 이어서 푼 투 포인터 문제이다.
이 문제는 N이 최대 400만 이므로 완전탐색을 통해 풀면 시간초과가 나게 된다.
또한 소수를 판별하는 알고리즘 역시 일반적인 방법이 아닌 속도를 개선한 알고리즘을 사용해야 한다.
나는 '에라토스테네스의 체' 알고리즘을 이용하여 N까지의 소수를 선별하여 arr벡터에 담는 작업을 했다.
그 후에는 N까지의 소수가 담긴 arr벡터를 이용하여 두개의 포인터로 부분합을 만족하는 경우를 찾으면 된다.
1과 2에대한 예외처리를 하고나서 정답처리가 나왔다.
/*
21.01.04
BOJ : 1644 부분합 (https://www.acmicpc.net/problem/1644)
투 포인터
*/
#include <bits/stdc++.h>
using namespace std;
bool check[4000001];
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
vector <int> arr;
int n;
cin >> n;
if (n == 1) {
cout << 0;
return 0;
}
if (n == 2) {
cout << 1;
return 0;
}
int rootSqrt = sqrt(n);
for (int i = 2; i <= rootSqrt; i++) {
if (check[i]) {
continue;
}
for (int j = i + i; j <= n; j += i) {
check[j] = true;
}
}
for (int i = 2; i <= n; i++) {
if (!check[i])
arr.push_back(i);
}
int s, e, sum, ans;
s = e = sum = ans=0;
int size = arr.size();
while (e<size) {
if (sum < n) {
sum += arr[e++];
}
else {
sum -= arr[s++];
}
if (sum == n) ans++;
}
if (!check[n]) ans++;
cout << ans;
}
'알고리즘 풀이' 카테고리의 다른 글
BOJ : 12562 친구비 (0) | 2021.01.24 |
---|---|
BOJ : 2517 달리기 (0) | 2021.01.13 |
BOJ : 14921 용액 합성하기 (0) | 2021.01.09 |
BOJ : 1806 부분합 (0) | 2021.01.04 |
BOJ : 14003 가장 긴 증가하는 부분 수열5 (0) | 2020.08.26 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 중앙대학교
- 세그먼트 트리
- 백준
- typeORM
- nest.js
- 벨만포드
- node.js
- 컴퓨터 통신
- 알고리즘
- 예외처리
- 동적계획법
- 스레드
- boj
- 자바스크립트
- 그리디
- 구현
- nestjs
- ReactNative
- java
- 백트래킹
- 그래프
- dfs
- Computer Architecture
- 시뮬레이션
- 투포인터
- BFS
- nodeJS
- 자바
- 재귀
- 컴퓨터 구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함