ALGORITHM_Sliding Window
π ALGORITHM
π μ¬λΌμ΄λ© μλμ° ( Sliding Window )
μ¬λΌμ΄λ© μλμ° λ?
μ¬λΌμ΄λ© μλμ°λ κ³ μ μ¬μ΄μ¦μ μλμ°κ° μ΄λνλ©΄μ μλμ° λ΄μ μλ λ°μ΄ν°λ₯Ό μ΄μ©ν΄ λ¬Έμ λ₯Ό νμ΄νλ μκ³ λ¦¬μ¦μ λ§νλ€.
λ°°μ΄μ΄λ 리μ€νΈ μμμ μΌμ λ²μ κ°μ λΉκ΅ν λ μ¬μ©νλ©΄ λ§€μ° μ μ©νλ€.
μλ λ€νΈμν¬μμ μ¬μ©λλ μκ³ λ¦¬μ¦μ λ¬Έμ νμ΄μ μμ©ν κ²½μ°μ΄λ€.
ν¬ ν¬μΈν°μ λΉμ·νλ°, μΌλ°μ μΌλ‘ κ³ μ μ¬μ΄μ¦ μλμ°λ₯Ό μ¬μ©νλ κ²½μ°λ₯Ό μ¬λΌμ΄λ© μλμ°λΌ ꡬλΆνκΈ°λ νλ€. κ·Έλ¦¬κ³ ν¬ ν¬μΈν°λ μ λ ¬λ λ°°μ΄μ λμμΌλ‘ νλλ° μ¬λΌμ΄λ© μλμ°λ κ΄κ³μμ΄ νμ©λλ€.
μ¬λΌμ΄λ© μλμ° μμ λ¬Έμ
π [JUNGOL_2577] νμ μ΄λ°₯
μ΄ λ¬Έμ μ νμ΄λ₯Ό ν΅ν΄ μμλ₯Ό 보μ¬μ£Όκ² λ€.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class main{
static StringTokenizer st;
static int N, d, k, c;
static int answer = Integer.MIN_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
st = new StringTokenizer(br.readLine(), " ");
// μ μ μ
N = Integer.parseInt(st.nextToken());
// μ΄λ°₯μ κ°μ§μ
d = Integer.parseInt(st.nextToken());
// μ°μν΄μ λ¨Ήλ μ μμ μ
k = Integer.parseInt(st.nextToken());
// μΏ ν° λ²νΈ
c = Integer.parseInt(st.nextToken());
// N+k μΈ μ΄μ λ μνμ΄κΈ° λλ¬Έ
int[] arr = new int[N+k];
// λ¨Ήμ μ΄λ°₯ λ°°μ΄
int[] check = new int[d+1];
// μ΄λ°₯ μ
λ ₯λ°κΈ°
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
// λ€μ λ μΆκ° ( μνμ΄κΈ° λλ¬Έμ )
for(int i=N; i<N+k; i++) {
arr[i] = arr[i-N];
}
int ans = -1;
// μΏ ν°μ ν΄λΉλλ μ΄λ°₯ μ μμ κ°μ
int cnt = 0;
int coupon = 0;
// μ¬λΌμ΄λ© μλμ° μ¬μ©
for(int i=0; i<N+k; i++) {
// μ μ kκ°λ₯Ό μ νν μνμμ λ€μ μ νμΌλ‘ λμ΄κ°μλ
if(i>=k) {
// 맨 λ€ μ μλΉΌκΈ°
if(--check[arr[i-k]] == 0) cnt--;
if(arr[i-k] == c) coupon--;
}
// νμ¬ μ μ μΆκ°
if(++check[arr[i]] == 1) cnt++;
if(arr[i] == c) coupon++;
if(i>=k)
ans = Math.max(ans, coupon == 0 ? cnt+1 : cnt);
}
System.out.println(ans);
}
}
λ¬Έμ λ ν¬κ² μ΄λ ΅μ§ μλ€.
μΏ ν°μ΄ μλλ° λ§μ½ μΏ ν°λ²νΈκ° μ ν μ΄λ°₯μ ν¬ν¨ν΄μ μ°μμΌλ‘ k κ° λ¨ΉμΌλ©΄ μ΄ kκ° μ΄λ°₯μ λ¨Ήμ μ μλ κ²μ΄κ³
μΏ ν°λ²νΈκ° μ ν μ΄λ°₯μ μ μΈνκ³ μ°μμΌλ‘ kκ° λ¨ΉμΌλ©΄ μ΄ k+1κ° μ΄λ°₯μ λ¨Ήμ μ μλ κ²μ΄λ€.
λ¬Όλ‘ μ°μμΌλ‘ μλ¨Ήλ κ²½μ°λ μλ€. κ·Έλ¬λ κ·Έλ° κ²½μ°μλ μΏ ν°μ μλ μ΄λ°₯μ λͺ»λ¨ΉκΈ° λλ¬Έμ μ΅λκ°μ ꡬν΄μΌνλ μ
μ₯μΌλ‘μ κ³ λ €νμ§ μμλ λ μ¬νμ΄λ€.
μ¬κΈ°μ μ€μν κ²μ λ§μ½ κ°μ λ²νΈμ μ΄λ°₯μ΄ 2κ°μ΄μ ν κ·Έλ£Ήμ μλ κ²μ΄λ€.
κ·Έ λ μ΄λ°₯ κ°μ μΉ΄μ΄ν
μ μ΄λ»κ² ν΄μ€μΌνμ§ κ³ λ―Όνλ€κ° μμ ν¬ν¨νμ§ μμλ€. λ£μ΄μ£Όμ§λ μμκ³ μΉ΄μ΄ν
ν΄μ£Όμ§λ μμλ€.
μ½κ° λΉμ리 κ°μ λλμΌλ‘ ? μ¬μ€ μ°μ°μλ λ€ ν¬ν¨ λμ΄ μμ§λ§ κ²μΌλ‘보면 ν¬ν¨λμ΄ μμ§ μμ λλμ΄λ€.
κΈ°μ‘΄ μ΄λ°₯ λ°°μ΄κ³Ό λ¨Ήμ μ΄λ°₯ λ°°μ΄μ λλκ³ μ μμ°μ°μλ₯Ό μ¬μ©νμ¬ μ’ λ μ½λλ₯Ό κ°λ¨ν νμλ€.
μ΄ νμ΄μμ μ¬λΌμ΄λ© μλμ°λ₯Ό μ¬μ©νμλλ° μ£Όμμ λ¬λ¦° κ² μ²λΌ μ ννλ indexκ° kκ° μ΄μμ΄ λμμ λ 맨 λ€ μ μ νλλ₯Ό λΉΌμ£Όκ³ νμ¬ μ μλ₯Ό λν΄μ£Όμλ€.
κ΅³μ΄ int λ°°μ΄μ΄ μλλλΌλ queue λ λ€λ₯Έ λ°©λ²μΌλ‘ ν΄λ μκ΄μ΄ μμ κ² κ°λ€.
μ€νλ € κ°λ
μ±μ΄ λ μ’μ μλ.. μ μ μ°μ°μ, νμ μ°μ°μλ₯Ό μ¬μ©νμ¬ κ°λ
μ±μ΄ μ’μ§ μμ§λ§ μκ°μ νμ€ν λΉ λ₯Έ κ² κ°λ€.