[알고리즘] Java / 백준 / 회전 초밥 / 15961

[알고리즘] Java / 백준 / 회전 초밥 / 15961

문제


문제 링크



접근 방식


  1. 0번째 초밥부터 k번째 초밥까지의 초밥들을 카운팅 배열에 저장하고 중복을 제외한 값을 카운팅한다
  2. 투포인터로 다음 1번째부터 k+1번째 초밥으로 이동하며 이 때 0번째의 초밥을 카운팅 배열에서 제거하고 k+1번째 초밥을 카운팅 배열에 추가한다.
  3. 카운팅 배열에서 제거할 초밥이 쿠폰적용 초밥일 경우에는 제거하지 않는다.


코드


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_15961 {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(st.nextToken());
		int d = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		int c = Integer.parseInt(st.nextToken());
		
		int[] arr = new int[N+k];
		
		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[] countArr = new int[d+1];
		int cnt = 0;
		
		for(int i=0;i<k;i++) {
			
			if(countArr[arr[i]] == 0) {
				cnt++;
			}
			countArr[arr[i]]++;
		}
		
		if(countArr[c] == 0) {
			countArr[c]++;
			cnt++;
		}
		
		int max = cnt;
		
		int l = 0;
		int r = k;

		while(l != N-1) {
			if(arr[l] != c ) {
				countArr[arr[l]]--;
				
				if(countArr[arr[l]] == 0) cnt--;
			}
			
			
			if(countArr[arr[r]] == 0) {
				cnt++;
			}
			countArr[arr[r]]++;
			
			
			max = Math.max(max, cnt);
			
			l++;
			r++;
		}
		
		System.out.println(max);
		
	}

}

좋은 웹페이지 즐겨찾기