답은 알고리즘 뿐이야!

[BOJ 11003] 최솟값 찾기 본문

알고리즘/백준문제풀이

[BOJ 11003] 최솟값 찾기

skyde47 2020. 1. 8. 00:24

문제 출처 : https://www.acmicpc.net/problem/11003

 

풀이 :

 

슬라이딩 윈도우로 푸는 문제이고 덱으로 풀었습니다.

값을 받아서 덱의 맨 뒤에서 자신보다 큰 수를 다 팝한후 푸쉬합니다.

그 이유는 현재 윈도우에서 현재값보다 큰 수들은 최솟값 후보가 될 수 없기 때문입니다.

최솟값을 출력할 때에는 현재 덱의 맨 앞의 값이 윈도우에 포함되는지 여부를 파악한 후 포함되지 않으면 최솟값이 아니니 팝하고 포함되면 출력합니다.

 

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
#include<iostream>
#include<queue>
#include<stdio.h>
using namespace std;
 
struct num {
    int v, s;
    num(int v, int s) :v(v), s(s) {}
    num(){}
};
 
int n, l, t;
 
deque<num> dq;
 
int main() {
    scanf("%d %d"&n, &l);
    for (int i = 0; i < n; i++) {
        scanf("%d"&t);
        while (dq.size() && dq.back().v >= t)dq.pop_back();
        dq.push_back(num(t, i));
        if (dq.front().s < i - l + 1)dq.pop_front();
        printf("%d ", dq.front().v);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

'알고리즘 > 백준문제풀이' 카테고리의 다른 글

[BOJ 3176] 도로 네트워크  (0) 2020.01.14
[BOJ 3860] 할로윈 묘지  (0) 2020.01.14
[BOJ 2517] 달리기  (0) 2020.01.08
[BOJ 1103] 게임  (0) 2020.01.06
[BOJ 1062] 가르침  (0) 2020.01.06
Comments