1. ๋ฌธ์ ์ค๋ช
2. ์ ๊ทผ ๋ฐฉ์
์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ์๋ฃ๊ตฌ์กฐ ๋ฑํ๋ฅผ ์ด์ฉํ๋ค.
ํด๋น ๋ฌธ์ ๋ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ์ด๋ฏธ 10^6์ด๋ผ์ O(n) ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํด์ผํ๋ค. ์ด ๋ฌธ์ ๋ฅผ ์๋์ฐ ์์ ์๋ ๊ฐ๋ค์ ์ต์๊ฐ ์ ๋ ฌํด์ ํ๋ ค๋ ์ฌ๋๋ค์ด ์์์ง ๋ชจ๋ฅด๋๋ฐ, ์ ๋ ฌ์ O(nlogn)์ด ๋ค์ด์ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค.
๋ฐ๋ผ์ ๋ฑ์ ์ด์ฉํด ์ ๋ ฌ์ ํจ๊ณผ๋ฅผ ๋ด์ผํ๋ค. ๋ฑํ์ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ฌ ๋ฐ๋ผ๋ณด๊ณ ์๋ ๊ฐ์ ๋ฑํ์ ๋ฃ์ ์์ ์ด๋ค.
(1) ๋ง์ฝ ๋ฑํ์ ๊ผฌ๋ฆฌ์ ์๋ ๊ฐ๋ณด๋ค ํ์ฌ ๋ฃ์ผ๋ ค๊ณ ํ๋ ๊ฐ์ด ์์ผ๋ฉด ๊ผฌ๋ฆฌ์ ์๋ ๊ฐ์ ์ ๊ฑฐํ๋ค.
(2) ์ด์งํผ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ์ค ์ ์ผ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ์ด ๋ ์๋ค๋ฉด ๊ทธ๊ฒ๋ณด๋ค ์ผ์ชฝ์ ์๋ ๊ฐ์ด ํด ๊ฒฝ์ฐ, ์ธ๋ชจ๊ฐ ์๋ค. ์ด์งํผ ์ฌ๋ฆฌ์ด๋ฉ ์๋์ฐ๊ฐ ์ด๋ํ๋ ๋ด๋ด, ํ์ฌ ์์๋ณด๋ค ์๋์ ์ผ๋ก ์ผ์ชฝ์ ์๋ ๊ฐ๋ค์ด ์ต์๊ฐ์ผ๋ก ์ฐ์ผ ์ผ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.ํ์ฌ ๋ฐ๋ผ๋ณด๊ณ ์๋ ๊ฐ์ ๋ฃ์ผ๋ฏ๋ก์จ, ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์์ญ์ ๋ฒ์ด๋๋ ๊ฐ์ ์ญ์ ํ๋ค.
์ด๋ฅผ ์ํด์๋ ๊ฐ๋ง๋ค ์์ ์ index์ value๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. Node๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์ด๋ฅผ ์ ์ฅํด์ ์งํํ๋ค.
3. ์ฝ๋ ๋ถ์
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.StringTokenizer;
public class Main {
static int cnt = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int L = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
ArrayDeque<Node> aq1 = new ArrayDeque<>();
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= N; i++) {
Node now = new Node(i, Integer.parseInt(st.nextToken()));
if(aq1.isEmpty()) aq1.add(now);
else{
if(now.idx - L > 0 && aq1.getFirst().idx <= now.idx - L) aq1.poll();
while(!aq1.isEmpty() && aq1.getLast().v > now.v){
aq1.pollLast();
}
aq1.add(now);
}
sb.append(aq1.getFirst().v).append(" ");
}
System.out.println(sb);
}
}
class Node {
int idx;
int v;
public Node(int idx, int v){
this.idx = idx;
this.v = v;
}
}