|
| 1 | +package it_company_work_book.silver; |
| 2 | + |
| 3 | +import java.io.BufferedReader; |
| 4 | +import java.io.IOException; |
| 5 | +import java.io.InputStreamReader; |
| 6 | + |
| 7 | +// 회전초밥 |
| 8 | +// 투포인터, 브루트포스, 슬라이딩 윈도우 |
| 9 | +/** |
| 10 | + * 현 윈도우 상태에 맞게 현재 먹은 스시 개수 및 중복을 처리할 sushiCounts 배열을 두고, |
| 11 | + * 중복과 쿠폰을 고려해서 겹치지 않는 스시 개수를 구할 uniqueCount 을 둔다. |
| 12 | + * 초기 슬라이딩 윈도우 값을 구한 다음, 해당 값에서 인덱스를 1씩 이동해가며 윈도우의 처음 인덱스 값을 윈도우의 다음 인덱스를 추가한다. |
| 13 | + * 원형 배열이기 때문에 %연산을 통해서 범위를 지정한다. |
| 14 | + */ |
| 15 | +public class BOJ_2531 { |
| 16 | + |
| 17 | + public static void main(String[] args) throws IOException { |
| 18 | + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); |
| 19 | + |
| 20 | + String []s = br.readLine().split(" "); |
| 21 | + int N = Integer.parseInt(s[0]); |
| 22 | + int d = Integer.parseInt(s[1]); |
| 23 | + int k = Integer.parseInt(s[2]); |
| 24 | + int c = Integer.parseInt(s[3]); |
| 25 | + |
| 26 | + int [] dishes = new int[N]; |
| 27 | + |
| 28 | + for(int i=0; i<N; i++){ |
| 29 | + int dish = Integer.parseInt(br.readLine()); |
| 30 | + dishes[i] = dish; |
| 31 | + } |
| 32 | + |
| 33 | + int [] sushiCounts = new int[d+1]; // 각 초밥 종류별 먹은 개수 |
| 34 | + int uniqueCount = 0; // 현재 윈도우 내 고유한 초밥의 개수 |
| 35 | + |
| 36 | + for(int i=0; i<k; i++){ |
| 37 | + if(sushiCounts[dishes[i]] == 0){ |
| 38 | + uniqueCount++; // 처음 먹어보는 종류라면 증가 |
| 39 | + } |
| 40 | + sushiCounts[dishes[i]]++; |
| 41 | + } |
| 42 | + |
| 43 | + int maxCount = uniqueCount; |
| 44 | + |
| 45 | + // 먹은 초밥에 쿠폰 초밥이 없다면 +1 |
| 46 | + if(sushiCounts[c] == 0){ |
| 47 | + maxCount = Math.max(maxCount, uniqueCount + 1); |
| 48 | + } |
| 49 | + |
| 50 | + for(int i=0; i<N; i++){ |
| 51 | + int removeDish = dishes[i]; |
| 52 | + sushiCounts[removeDish]--; |
| 53 | + if(sushiCounts[removeDish] == 0){ // 더이상 이 종류의 초밥이 윈도우에 없다면 |
| 54 | + uniqueCount--; |
| 55 | + } |
| 56 | + |
| 57 | + // 새로 들어오올 초밥 추가, 원형 배열이므로 %로 인덱스 처리 |
| 58 | + int addDish = dishes[(i+k) %N]; |
| 59 | + if(sushiCounts[addDish] == 0){ |
| 60 | + uniqueCount++; |
| 61 | + } |
| 62 | + sushiCounts[addDish]++; |
| 63 | + |
| 64 | + // 최대 가짓수 갱신 (쿠폰 초밥 포함 여부 확인) |
| 65 | + int currentMax = uniqueCount; |
| 66 | + if(sushiCounts[c] == 0){ |
| 67 | + currentMax++; |
| 68 | + } |
| 69 | + maxCount = Math.max(maxCount, currentMax); |
| 70 | + } |
| 71 | + |
| 72 | + System.out.println(maxCount); |
| 73 | + |
| 74 | + } |
| 75 | +} |
0 commit comments