본문 바로가기

백준/슬라이딩윈도우

회전초밥 - Java

728x90

https://www.acmicpc.net/problem/2531

 

2531번: 회전 초밥

첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤

www.acmicpc.net

package a1005;

import java.util.*;
import java.io.*;


public class 회전초밥 {

	static int n,d,k,c;
	static int []arr;
	public static void main(String[] args) throws IOException {
		
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer 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());
		
		arr = new int[n+k-1];
		
		for(int i=0; i<n; i++) {
			
			arr[i] = Integer.parseInt(br.readLine());
		}
		
		for(int i=n; i<n+k-1; i++) {
			
			if((i-n)>=0) {
			arr[i] = arr[i-n];
			}
		}
		
		int[]chk = new int[d+1];
		
		
		int total =0;
		
		int cnt=0;
		for(int i=0; i<k; i++) { //윈도우 크기 k, 이만큼 정보저장
			
			chk[arr[i]]++;
			if(chk[arr[i]]==1)cnt++;
			
		}
		
		boolean tg = false; //쿠폰추가
		total =cnt+1;//쿠폰추가
		if(chk[c]>0) {tg=true;total--;}
		
		int j =k-1;
		int i=0;
		while(j<arr.length) { //슬라이딩 윈도우를 이용해서 구한다 
			
			chk[arr[i]]--;
			if(chk[arr[i]]==0)cnt--;
			i++;
			
			j++;
			if(j>=arr.length)break;
			chk[arr[j]]++;
			if(chk[arr[j]]==1)cnt++;
			if(chk[c]>0)tg=true;
			else tg=false;
			
			if(tg) {
				total = Math.max(total, cnt);
			}
			else {
				total = Math.max(total, cnt+1);
			}
			
		}
		

		
		System.out.println(total);
		
		
		
		
		
		
	}
	
	
}

'백준 > 슬라이딩윈도우' 카테고리의 다른 글

DNA비밀번호  (1) 2021.10.02
N번째 큰수  (0) 2021.10.02
가장긴짝수연속합부분수열  (0) 2021.10.02
게으른 백곰 - 10025번(Java)  (0) 2021.09.16
꿀아르바이트 - 12847번(Java)  (0) 2021.09.16