Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- boj 2206
- boj 2178
- 백준 1503
- 백준 2636
- boj 1503
- 10800
- boj 19238
- 백준 2661
- 백준 2206
- 백준 2470
- boj 2470
- 백준 2167
- 백준 2178
- boj 2661
- boj 10800
- boj 2636
- 2636
- 백준 19238
- 백준 2635
- boj 2108
- boj 2167
- boj 2667
- 백준 1806
- boj 1806
- 백준 2108
- 2167
- 백준 1697
- 백준 10800
- boj 2635
- boj 1697
Archives
- Today
- Total
말랑말랑한 개발자 이야기
[백준 11003번] 최솟값 찾기 본문
[백준 11003번] 최솟값 찾기
문제
N개의 수 A1, A2, ..., AN과 L이 주어진다.
Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.
입력
첫째 줄에 N과 L이 주어진다. (1 ≤ L ≤ N ≤ 5,000,000)
둘째 줄에는 N개의 수 Ai가 주어진다. (-109 ≤ Ai ≤ 109)
출력
첫째 줄에 Di를 공백으로 구분하여 순서대로 출력한다.
풀이
#include <iostream>
#include <queue>
using namespace std;
struct cmp{
bool operator()(pair<int, int> &a, pair<int, int> &b){
if(a.first == b.first) return a.second < b.second;
return a.first > b.first;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, L; cin >> N >> L;
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> q;
for(int i=0;i<N;i++){
int a; cin >> a;
q.push(make_pair(a, i));
while(q.top().second <= i - L) q.pop();
cout << q.top().first << ' ';
}
return 0;
}
우선순위 큐를 활용하여 문제를 풀었다. 큐의 top에 가장 작은 값이 나오도록 유지하면서, L의 범위에 벗어나게 되면 pop해주면 된다. 덱으로도 풀 수 있다는데 생각보다 쉽게 풀렸다. 물플레 문제라고 해서 풀어봤는데 경험치 파밍문제였다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준 1590번] 캠프가는 영식 (0) | 2021.09.14 |
---|---|
[백준 1253번] 좋다 (0) | 2021.09.14 |
[백준 22868번] 산책 (small) (0) | 2021.09.14 |
[백준 20057번] 마법사 상어와 토네이도 (0) | 2021.09.14 |
[백준 20058번] 마법사 상어와 파이어스톰 (0) | 2021.09.14 |