1. ๋ฌธ์ ์ค๋ช ๐
์ฌ๋ผ์ด๋ฉ ์๋์ฐ์์ ๋ ๋์๊ฐ์, ์๋์ฐ ๊ตฌ๊ฐ์์ ์ต์๊ฐ์ ๋งค๋ฒ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค.
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: Sliding Window
, Data Structure (Deque)
ํ์ด์ฌ์์๋ ์ถ๊ฐ์๊ฐ์ด ์ฃผ์ด์ค์ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํด๋ ํ๋ฆฌ์ง๋ง, Java์์๋ ํ๋ฆฌ์ง ์๋๋ค. ์ ์ฐ์ ์์ ํ๋ก๋ ์๋๋์ง์ ๋ํด 4๋ฒ ํญ๋ชฉ์์ ์ค๋ช ํ๊ฒ ๋ค.
(1) ์ ์ฒด ์ ๊ทผ ๋ฐฉ์
- ArrayDeque๋ก ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ๊ตฌํํ๋ค.
(ํด๋น deque๋ ํ์ฌ ๊ตฌ๊ฐ์ธ ๊ฐ๋ค๋ง ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ค๋ฆ์ฐจ์์ผ๋ก ๊ฐ์ ์์๋ฅผ ์ ์งํ๋ค. (front = ์ต์๊ฐ)) - ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ์ฉ ์์ง์ธ๋ค.
- ๊ตฌ๊ฐ์ ์ ๊ท๋ก ์ถ๊ฐ๋ ๊ฐ์ A๋ผ๊ณ ์ณค์ ๋, A์ deque์ rear(๊ผฌ๋ฆฌ)๋ฅผ ๋น๊ตํ๋ค
rear > A
: A๊ฐ ๋ ์ต์๊ฐ์ด๋ผ๋ฉด, rear๋ฅผ deque์์ ์ ์ธ์ํจ๋ค. (๋ฐ๋ณต)rear < A
: A๋ฅผ deque์ ์ถ๊ฐํ๋ค.
- ํ ๊ตฌ๊ฐ์ ๋ํ ๊ณ์ฐ์ด ์๋ฃ๋์์์ผ๋ก, deque์ front ๊ฐ์ ์ถ๋ ฅํ๋ค. (ํ์ฌ ๊ตฌ๊ฐ์ ์ต์๊ฐ)
(2) ๊ทธ๋ฆผ์ ํ์ฉํ ํด์ค
๋ฌธ์ ์ 1,2๋ฒ์ deque๋ฅผ ํ์ฉํ๋ค๋ ๊ฒ๋ง ์ ์ธํ๋ฉด ์ผ๋ฐ์ ์ธ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ผ์ ์ดํด์ ์ง์ฅ์ด ๊ฐ์ง ์์ ๊ฒ์ด๋ค. 1๋ฒ์์ ๊ธฐ๋กํ deque์ ์กฐ๊ฑด = "deque๋ ํ์ฌ ๊ตฌ๊ฐ์ธ ๊ฐ๋ค๋ง ๊ฐ์ง๊ณ ์์ผ๋ฉด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ์งํ๋ค."๊ฐ ์ ๊ทธ๋ฐ์ง๋ ์ฐจ์ฐจ ์ค๋ช ํ๊ฒ ๋ค. ๋จผ์ deque ์์๋ L๊ฐ ์ดํ์ ๊ฐ์ด ์ ์ฅ๋์ด ์๋ค.๋ง ์๊ณ ์์ผ๋ฉด ๋๋ค.
์์ ๊ทธ๋ฆผ์ด ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์งํํ๊ธฐ ์ ์ด๋ฐ ์ธํ ์ด๋ค. ์ด์ ํ๋์ฉ ํด๋ณด์.
a. deque๊ฐ ๋น์์ ์
deque๊ฐ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋น์๋ค๋ฉด ๊ทธ์ ํ์ฌ ๊ตฌ๊ฐ์ ์ ๊ท๋ก ์ฝ์ ๋ ๊ฐ์ deque์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. ์ฌ๊ธฐ์๋ 1์ ์ถ๊ฐํ๊ฒ ๋ ๊ฒ์ด๋ค.
b. deque๊ฐ ๋น์ด์์ง ์์ ์
์์ ์ ๊ทผ๋ฐฉ์ ์ค 3
๋ฒ์ ํด๋นํ๋ ์์ ์ด๋ค. ๋ค์์ผ๋ก ๋ค์ด์ฌ ์๋ '5'์ธ๋ฐ, 5๋ 1๋ณด๋ค ํผ์ผ๋ก, ๊ท์น์ ๋ฐ๋ผ ๊ทธ์ ์ถ๊ฐํ๋ค.
๋ค์์ผ๋ก ๋ค์ด์ฌ ์๋ '2'์ด๋ค. 2๋ 5๋ณด๋ค ํฌ๋ค. ๋ฐ๋ผ์ 5๋ฅผ deque์์ ๋นผ๋ด๊ณ , ์ถ๊ฐ์์ผ์ผ ํ๋ค.
์ 5๋ฅผ ๋นผ๋ผ๊น? :thinking:
5์ ํ์์๊ฐ ๋๋ ์ ์ค์, 5๋ณด๋ค ์์ ์๊ฐ ์กด์ฌํ๋ค. ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์์ง์ผ ๋๋ง๋ค, ์ต์ข๋จ์ ๊ฐ์ ๋น ์ง๊ณ , ์ต์ฐ๋จ์ ์ ๊ท๊ฐ์ด ์ถ๊ฐ๊ฐ ๋๋ค. ๋ฐ๋ผ์ 5๊ฐ ๊ตฌ๊ฐ์์ ์ด์์์ ๋์ ํ์์๊ฐ ๋๋ ๊ฐ์ ๋ฌด์กฐ๊ฑด ์ด์์๋ค. ๊ทธ๋ฌ๋ฏ๋ก, 5๊ฐ ์ต์๊ฐ์ด ๋ ์ผ์ด ์์ด์ง๋ค. ์ด๋ฌํ ๋ ผ๋ฆฌ์ ์ํด 5๋ ํ์์๋ ๊ฐ์ด ๋๋ฏ๋ก ๋นผ๋ด์ด์ค๋ค.
2๋ ์ด์๋จ๋ ์ด์
2๋ ๊ตฌ๊ฐ์ด ์์ง์ด๋ฉด์ '1'์ด๋ ๊ฐ์ด ์ฌ๋ผ์ง ๊ฒฝ์ฐ, ์ต์๊ฐ์ด ๋ ์ ์๋ ์ ๋ ฅํ ํ๋ณด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์์ง์ฌ๋ณด์.
3์ 2๋ณด๋ค ์์ผ๋ deque์ ์ถ๊ฐ๋๋ค.
6๋ ๋ง์ฐฌ๊ฐ์ง ์ด๋ค. ๋ค์์ด ์ค์ํ๋ค.
๋จผ์ ์๋์ฐ๊ฐ ์์ง์์ ๋ฐ๋ผ ์ต์ข๋จ์ 2๋ ์ ๊ฑฐ๋๋ค. ์ดํ ์๋ก์ด 2๊ฐ ์ ๋ ฅ๋๋ค. ์ต์ฐ๋จ์ ๊ฐ์ผ๋ก 2๊ฐ ์ถ๊ฐ๋๋ ์์ ์์ 3๊ณผ 6์ ์ธ๋ชจ์๋ ๊ฐ์ด ๋์ด๋ฒ๋ฆฐ๋ค. ์์ ๋ค์ด ์ด์์์ ๋์์ 2๊ฐ ํญ์ ์ต์๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ 3๊ณผ 6์ deque์์ ์ ๊ฑฐํ๊ณ 2๋ง ์ด์๋จ๋๋ค.
์ด๋ฐ ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ๋ฉด ๋๋ค. ํ๋ ๋น ํธ๋ฆฐ ๊ฒ์ด ์์ ๊ฐ์ด deque๋ฅผ ์์ง์ผ ๋๋ง๋ค, deque์ peek()์ด ์ต์๊ฐ์์ผ๋ก ์ด๋ฅผ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค๋ ๊ฒ์ด๋ค.
3. ์ฝ๋ ์๊ฐ ๐
import java.io.*;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
/*
* 1. ArrayDeque๋ก ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ๊ตฌํ
* 2. ํด๋น ์๋์ฐ์์ ๊ฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ, ์ฆ deque์ front๋ ์ต์๊ฐ์ ์ ์ง
* 3. deque์ rear์ ํ์ฌ ์๋ก ์ฝ์
๋ ๊ฐ์ ๋น๊ต, ๋ง์ฝ ์ฝ์
๋ ๊ฐ์ด ๋ ์๋ค๋ฉด, deque์ rear๊ฐ ์ ๊ฑฐ
* (why? - ์ดํ์ ๊ฐ๋ค ์ค ์ด๋ฏธ ์์ ๋ณด๋ค ์์ ๊ฐ์ด ๋์๋ค.
* == ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์ด๋ํ๋๋ผ๋ ์ด์ ์์ ์ด ์ต์๊ฐ์ผ ๊ฐ๋ฅ์ฑ์ ์๋ค.)
* 4. ์๋ก ์ฝ์
๋ ๊ฐ์ด deque์ rear๋ณด๋ค ํฌ๋ค๋ฉด ์ด์ deque์ ์ฝ์
* (why? - ๋ง์ฝ front์ ๊ฐ์ด ๋ฒ์๋ฅผ ์ง๋์ณ์ ์๋์ฐ ๋ด๋ถ์์ ๋น ์ ธ๋๊ฐ๋ฉด ์ต์๊ฐ์ด ๋ ํ๋ฅ ์ด ์๋ค.)
* */
public static void main(String[] args) throws IOException {
StringBuilder ans = new StringBuilder();
int N, L;
ArrayDeque<Num> window = new ArrayDeque<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
if (window.isEmpty()) window.add(new Num(i, Integer.parseInt(st.nextToken())));
else {
int now = Integer.parseInt(st.nextToken());
if(window.peek().i <= i-L){window.poll();}
while (!window.isEmpty()&& window.peekLast().v > now) window.pollLast();
window.add(new Num(i, now));
}
ans.append(window.peek().v).append(" ");
}
System.out.println(ans);
}
}
class Num {
int i;
int v;
public Num(int i, int v){
this.i = i;
this.v = v;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
์ค๋๋ง์ deque๋ฅผ ์ฌ์ฉํ๋ คํ๋, ๋ช
๋ น์ด๊ฐ ํท๊ฐ๋ ธ๋ค. java ๋ช
๋ น์ด๊ฐ front์ rear๋ก ๊ตฌ๋ถ๋์ด ์์ผ๋ฉด, ๋น ๋ฅด๊ฒ ๋ค์ ์ดํดํ์ํ
๋ฐ first
์ last
๋ก ๋ช
๋ น์ด๋ฅผ ๊ตฌ๋ถํด๋์, 'deque์ front์ ๋ฃ์ผ๋ ค๋ฉด ๋ฌด์จ ๋ช
๋ น์ด๋ฅผ ์จ์ผํ์ง?' ๋ผ๋ ์๊ฐ์ ํค๋ฉจ๋ค. ๊ทธ๋์ ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค.
queue๋ ๋ง์ฐฌ๊ฐ์ง์ง๋ง, deque๋ ๊ผฌ๋ฆฌ๋ก ์ ๋ ฅ์ด ๋ค์ด์์ ๋จธ๋ฆฌ๋ก ์ถ๋ ฅ๋๋ ์ ์ ์ ์ถ(๋จผ์ ๋ค์ด๊ฐ ๊ฒ์ด ๋จผ์ ๋์ค๋) ๊ตฌ์กฐ ์ด๋ค.
๊ฐ๊ฐ์ first์ Last๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ queue์ ์ฑ์ง์ ๋ฐ๋ผ ์์ฐ์ค๋ฝ๊ฒ (๊ผฌ๋ฆฌ์ ๊ฐ์ ์ง์ด๋ฃ๊ณ , ๋จธ๋ฆฌ๊ฒ์ ์ถ๋ ฅ) ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, queue์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๋ช
๋ น์ด๋ก ๊ฐ๋ฅํ๋ค. ํ์ง๋ง deque
๋ง์ ์ฑ์ง์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, (๋จธ๋ฆฌ๋ก ๊ฐ์ ์ง์ด๋ฃ๊ณ , ๋ฅ๊ผฌ์์ ๋นผ๋ด๋) ์์ ๊ฐ์ด first
๋ Last
๋ฅผ ๋ช
๋ช
ํด์ค์ผ ํ๋ค.