1. Monotone Stack (단조 스택)
- 스택의 원소들을 단조롭게(오름차순 or 내림차순) 유지하는 기법이다.
그림으로 Monotone Stack 이해하기
- 아래 그림과 같은 수열이 있을 때, 오름차순으로 단조 스택을 만드는 과정은 다음과 같다.
구현 방법
수열을 순회하면서 다음을 수행한다.
- pop
top의 원소를 확인해서 현재 값보다 크거나 같은 값들을 제거한다. (오름차순) - push
현재 값을 스택에 저장한다.
코드
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <stack>
typedef long long ll;
using namespace std;
int main() {
cin.tie(0); cout.tie(0);
ios_base::sync_with_stdio(false);
int n;
ll tmp, ans = 0;
stack<ll> st;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> tmp;
while (!st.empty() && (st.top() <= tmp))
st.pop();
ans += st.size();
st.push(tmp);
}
cout << ans;
return 0;
}
https://www.acmicpc.net/problem/6198
6198번: 옥상 정원 꾸미기
문제 도시에는 N개의 빌딩이 있다. 빌딩 관리인들은 매우 성실 하기 때문에, 다른 빌딩의 옥상 정원을 벤치마킹 하고 싶어한다. i번째 빌딩의 키가 hi이고, 모든 빌딩은 일렬로 서 있고 오른쪽으
www.acmicpc.net
2. Monotone Queue (단조 큐)
- 큐 안의 원소들을 단조롭게(오름차순 or 내림차순) 유지하는 기법이다.
그림으로 Monotone Queue 이해하기
- 아래 그림과 같은 수열이 있을 때, 오름차순으로 단조 큐를 만드는 과정은 다음과 같다.
구현 방법
수열을 순회하면서 다음을 수행한다.
- pop_back
뒤에서부터 현재 값보다 크거나 같은 값들을 제거한다. (오름차순) - push_back
현재 값을 큐의 맨뒤에 저장한다. - pop_front
조건에 만족하지 않는 수들을 앞에서부터 제거한다.
코드
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <deque>
typedef long long ll;
using namespace std;
int main() {
ll n, m, tmp;
deque<pair<ll, ll>> dq;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> tmp;
while (!dq.empty() && tmp <= dq.back().first)
dq.pop_back();
dq.push_back({ tmp,i });
while (dq.front().second <= i - m)
dq.pop_front();
cout << dq.front().first << ' ';
}
}
https://www.acmicpc.net/problem/11003
11003번: 최솟값 찾기
N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.
www.acmicpc.net
+) 모노톤 큐는 슬라이딩 윈도우 알고리즘에서 min / max 값을 찾기에 용이하다.
'알고리즘 > 알고리즘 이론' 카테고리의 다른 글
포함 배제의 원리 (Inclusion-Exclusion Principle) (1) | 2023.10.23 |
---|---|
Network Flow - 네트워크 플로우 (최대 유량 알고리즘) (0) | 2022.08.03 |
Disjoint set, 분리 집합, Union-Find (0) | 2022.03.08 |
탐색 알고리즘(DFS, BFS)과 활용 (0) | 2022.03.05 |
냅색(Knapsack) 알고리즘 (0) | 2022.03.04 |