※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 17638번 문제인 Separator이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/17638
17638번: Separator
Let A = (a1, a2, . . .) be a sequence of distinct integers. An index j is called a separator if the following two conditions hold: for all k < j: ak < aj, for all k > j: ak > aj. In other words, the array A consists of three parts: all elements smaller the
www.acmicpc.net
기존 수열에 새로운 항을 하나 추가할 때 separator의 개수가 어떻게 변화하는지를 관찰하는 것으로 문제를 해결할 수 있다.
1) 새로 추가되는 수가 separator인가?
정의에 따라, 기존에 등장한 모든 수보다 새로 추가되는 수가 크다면 이 수는 새로운 separator가 된다. 만약 기존에 등장한 수중 새로 추가되는 수보다 작거나 같은 수가 존재한다면 정의에 따라 새로 추가되는 수는 separator이 아니게 된다.
2) 기존 separator가 더이상 separator가 아니게 될 조건
조건 1)은 항상 만족하고 있으므로 기존 separator가 더이상 separator가 아니려면 기존 수보다 작거나 같은 수가 새로 추가되어야한다. 즉, 기존 separator이었던 수들 중 새로 추가되는 수보다 작거나 같은 수들은 더 이상 separator가 아니게 된다.
3) 기존에 separator가 아니던 수가 separator이 될 조건
불가능하다. 기존에 separator가 아니던 수는 새로 추가되는 단계에서 1)을 만족 못했거나 나중 단계에서 그 수의 오른쪽에 자신보다 작은 수가 등장한 경우 뿐이기 때문이다.
이중 2)를 빠르게 처리하기 위해 priority queue를 이용할 수 있다. 위의 아이디어를 이용해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <queue>
using namespace std;
priority_queue<int> pq;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int s = 0;
int mx = -1;
int N; cin >> N;
while (N--) {
int x; cin >> x;
s = (s + x) % 1000000000;
while (!pq.empty() && pq.top() >= s) pq.pop();
if (mx < s) {
mx = s;
pq.push(s);
}
cout << (s = pq.size()) << '\n';
}
}
'BOJ' 카테고리의 다른 글
[BOJ 3003 // C++] 킹, 퀸, 룩, 비숍, 나이트, 폰 (0) | 2022.11.20 |
---|---|
[BOJ 2607 // C++] 비슷한 단어 (0) | 2022.11.19 |
[BOJ 25985 // C++] Fastestest Function (0) | 2022.11.17 |
[BOJ 17637 // C++] Count Squares (0) | 2022.11.17 |
[BOJ 25972 // C++] 도미노 무너트리기 (0) | 2022.11.16 |