1. ๋ฌธ์ ์ค๋ช ๐
์ผ๋ฐ์ ์ธ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์์ ๊ตฌ๊ฐ ๋ด ์ต๋๊ฐ์ ๋ฐํํ๋ผ๋ ์กฐ๊ฑด์ด ์ถ๊ฐ๋์๋ค.
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: Sliding Window
, Data Structure(Deque)
(1) ์ฝ๋ ๊ตฌํ ์์
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ deque๋ก ๊ตฌํํ๋ค.
- ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ (์ต๋๊ฐ = peek())
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์์ ๋น ์ ธ๋๊ฐ๋ ๊ฐ์ deque์์๋ ๋๊ฐ์ด ์ ๊ฑฐ
rear > ์ ๊ท๊ฐ
: ์ ๊ท๊ฐ์ deque์ ์ถ๊ฐํ๋ค.rear < ์ ๊ท๊ฐ
: rear๋ฅผ poll ํ๋ค. (์ด๋ rear > ์ ๊ท๊ฐ์ด ๋ ๋๊น์ง ๋ฐ๋ณต)
- 0~2M-1์ ํด๋นํ๋ ๊ฐ๋ค์ ๋ํด ๋จผ์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์งํํ๋ค.
- M ~ N-M๊น์ง ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์งํํ๋ค. ์งํํ๋ฉฐ, ๋น์ ์ต๋๊ฐ์ StringBuilder์ ์ถ๊ฐํ๋ค.
(2) ํด์ค
ํด๋น ๋ฌธ์ ๋ i๋ผ๋ ์์์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก i-(M-1) ~ i+(M+1)๊น์ง์ ๊ฐ๋ค์ค ์ต๋๊ฐ์ ์ฐพ์์ผ ํ๋ ๋ฌธ์ ์ด๋ค. ์์์ ์ ๊ธฐ์ค์ผ๋ก ํ๋ ์ผ๋ฐ์ ์ธ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ๋ฌ๋ฆฌ, ์ด๊ธฐ๊ฐ ๊ณ์ฐ์ ๋จผ์ ์งํํด์ผ ํ๋ค.
๊ณผ์ 1๋ฒ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ตฌํ :hammer:
๋จผ์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ ํ ๊ตฌ๊ฐ์ ๊ฐ๋ค ์ค ์ ํจํ ๊ฐ๋ค์ด ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์๋ค. ์ฌ๊ธฐ์ ์ ํจํ์ด๋ ์กฐ๊ฑด์ ์ถ๊ฐํ ์ด์ ๋, ์ด๋ค ๊ฒฝ์ฐ์๋ ์ต๋๊ฐ์ด ๋ ์ ์๋ ์๋ค์ deque์์ ์ ์ธํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด ์๋์ฐ์ ์๋ก ์ถ๊ฐ๋ ๊ฐ์ A๋ผ๊ณ ํด๋ณด์. deque๋ ๋ด๋ฆผ์ฐจ์์ด๋, deque์์ ์ ์ผ ์์ ๊ฐ์ด deque์ rear์ ์์นํ๊ฒ ๋ ๊ฒ์ด๋ค. ๋ง์ฝ rear < A
๋ผ๋ฉด, rear๋ ์ดํ์ ์๊ธฐ๊ฐ ์ํ๋ ์๋์ฐ ๊ตฌ๊ฐ ์ ์ฒด์ ํตํ์ด ์ต๋๊ฐ์ด ๋ ์๊ฐ ์๋ค. ์๋ํ๋ฉด, rear๊ฐ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๋ด์์ ๋์ฌ๋๊น์ง ๋ถ์ด๋ค๋๋ ํ์์ A
๊ฐ ํญ์ rear๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ rear์ ๊ฐ์ pollํ๋ค.
๋ฐ๋๋ก, rear > A
๋ผ๋ฉด, rear๊ฐ ์๋์ฐ์์ ๋๊ฐ๋ ์๊ฐ, A๊ฐ ์ต๋๊ฐ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ์ deque์ ๋ฃ์ด๋๋ ๊ฒ์ด๋ค.
๊ฐ๋ น ๋ค์๊ณผ ๊ฐ๋ค๊ณ ํ ๋, ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ํ ์นธ ์ ์ง์ํค๊ฒ ๋ค.
2๋ 3 ๋๋ฌธ์ ์๋์ฐ์ ์ด์์๋ ๊ฒฝ์ฐ ๋์ ์ ๋ ์ต๋๊ฐ์ด ๋ ์ ์๋ค.
Deque๊ฐ Value๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋์ด ์๋๋ฐ, ์ด๋ป๊ฒ ๊ตฌ๊ฐ์ ์๋ ๊ฐ์ ์ ๊ฑฐํ ์ ์๋์? :thinking:
Deque์ peek()์ ๊ตฌ๊ฐ๋ด์ ์ต์ข๋จ ์ด๊ฑฐ๋ ๊ทธ๊ฑฐ๋ณด๋ค index๊ฐ ํฐ ๊ฐ์์ด ๋ณด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๋ค. deque๊ฐ ๊ฐ๋์ฐฐ ์ ์๋ ๊ฒฝ์ฐ๋ ๋งค๋ฒ ๋ค์ด์ค๋ ์ ๊ท๊ฐ์ด rear๋ณด๋ค ์์์ ์ญ์ ์์ด ์ถ๊ฐ๋ง ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ์ด๋ค. ์ด๋, deque์ peek()์ ํญ์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ์ต์ข๋จ์ด ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ deque.peek() < i - M ์ธ์ง๋ง ๊ฒ์ฌํด์ ์์ ๋ฉด ๋๋ค.
๊ณผ์ 2 ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ด๊ธฐ ์ธํ
์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ๊ธฐ์ค์ ์ด ์์์ ์ธ ๋ณดํต์ ๋ฌธ์ (ex- i ~ i+m๊น์ง๋ก ๊ตฌ๊ฐ ์ค์ )์ ๋ฌ๋ฆฌ ์ด๋ฒ ๋ฌธ์ ๋ ํ์ฌ ๊ฐ i๋ฅผ ๊ธฐ์ค์ผ๋ก i-m ~ i+m์ ๊ฐ์ ์๋์ฐ์ ๊ตฌ๊ฐ์ผ๋ก ์ค์ ํ๊ณ ์๋ค. ๋๋ ๊ฐ๋ ์ฑ์ ์ํด์ ๋จผ์ 1 ~ 2M-1๊น์ง์ ๊ฐ์ deque์ ์ ๋ ฌ ์์ผ๋๊ณ ์์ํ๋ค.
์์ธ์ฒ๋ฆฌ
ํด๋น ๋ฌธ์ ์์๋ 2M-1(์๋์ฐ์ ๊ตฌ๊ฐ) < N์ด๋ ๋ณด์ฅ์ด ์๋ค. ๋ฐ๋ผ์ ์๋์ฐ์ ๊ตฌ๊ฐ์ด ์ ์ฒด ์ซ์ ๊ธธ์ด๋ฅผ ๋์ ๊ฒฝ์ฐ, ๊ทธ์ ์ ์ฒด์์ ์ต๋๊ฐ์ ํ๋๋ง ์ถ๋ ฅํ๋ ๊ฒ์ผ๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.
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์ front๊ฐ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ตฌ๊ฐ์ ๋ฒ์ด๋๋์ง ํ์ธ ํ ์กฐ์น
* 4. ์ ๊ท๊ฐ๊ณผ deque์ rear๋ฅผ ๋น๊ต
* - rear > ์ ๊ท : ์ ๊ท ๊ฐ deque์ ์ถ๊ฐ
* - rear < ์ ๊ท : rear๋ฅผ poll() (๋ฐ๋ณต)
* 5. ๋งค ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์์ง์๋ง๋ค, deque์ front๋ฅผ ์ถ๋ ฅ
* */
public static void main(String[] args) throws IOException {
// ๋ณ์ ๋ชฉ๋ก
StringBuilder ans = new StringBuilder();
int N, M;
int [] ad;
int MAX_SIGHT;
ArrayDeque<Num> sight = new ArrayDeque<>();
// ์
๋ ฅ ๋ฐ๊ธฐ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
ad = new int [N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
ad[i] = Integer.parseInt(st.nextToken());
}
MAX_SIGHT = Math.min(2*M-1, N);
// ์ ๋ผ์ด๋ฉ ์๋์ฐ ์ด๊ธฐ ์ธํ
for (int i = 0; i < MAX_SIGHT; i++) {
if(sight.isEmpty()) sight.add(new Num(i, ad[i]));
else {
while (!sight.isEmpty()&& sight.peekLast().v < ad[i]){
sight.pollLast();
}
sight.add(new Num(i, ad[i]));
}
}
ans.append(sight.peek().v).append(" ");
// ์์ธ ์ฒ๋ฆฌ
if(MAX_SIGHT != 2*M-1) {
System.out.println(ans);
return;
}
// ๊ณ์ฐ
for (int i = M; i <= N-M; i++) {
if(!sight.isEmpty()&&sight.peek().i <= i-(M)) sight.poll();
while (!sight.isEmpty()&& sight.peekLast().v < ad[i+(M-1)]){
sight.pollLast();
}
sight.add(new Num(i+(M-1),ad[i+(M-1)]));
// System.out.printf("์ด๋ฒ์ ๋ฃ์ ์์ index: %d, ์ด๋ฒ์ ๋ฃ์ ์: %d\n",(i+(M-1)),ad[i+(M-1)]);
// sight.forEach(o -> System.out.printf("%d๋ฒ์งธ, %d || ",o.i, o.v));
// System.out.println("\n---------------------------------------");
ans.append(sight.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;
}
}
์ฝ๋๊ฐ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ค์ ์ฃผ์์ฒ๋ฆฌ๋ print๋ฌธ์ ์ฐธ๊ณ ํ๋ฉฐ ์ดํดํ์๊ธธ ๋ฐ๋๋ค.
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
๋๋ ์ต์๊ฐ ์ฐพ๊ธฐ๋ฅผ ๋ณต์ตํ๊ณ ์ ๋น์ทํ ์ ํ์ ๋ฌธ์ ๋ฅผ ์ฐพ๋ค๊ฐ ์ด๋ฒ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ฌ ํ๊ฒ ๋์๋ค. ์ด๋ฒ ๋ฌธ์ ๋ฅผ T/C๋ฅผ ์ฐพ์ง ์๊ณ ํ์ด์, T/C๋ฅผ ์๊ฐํด๋ด๋ ๋ฅ๋ ฅ์ ๊ธฐ๋ฅผ ์ ์์๋ค. ์ด๋ฒ ๋ฌธ์ ์์ T/C๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์
- N๊ณผ M์ ๋ฒ์ ์ ์ฌํ ๋ณด๊ธฐ
- ๊ฐ๋ค์ ๋ค์ํ ๊ฒฝ์ฐ์ ์๋ก ๋ง๋ค์ด ์ ๋ ฅ ๋ฃ์ด๋ณด๊ธฐ (์๊ฐ ์ ์ง์ ์ฆ๊ฐ or ๊ฐ์ํ๋ ๊ฒฝ์ฐ, ๊ฐ์ ๊ฐ๋ง ์ญ ์๋ ๊ฒฝ์ฐ ๋ฑ)