끄적끄적 코딩
article thumbnail
728x90

투포인터 문제입니다.
회전초밥에서 연속하는 k개를 골랐을 때 최대한 다양한 메뉴를 골라야합니다.
k개를 골랐을 때 쿠폰으로 한 종류를 주기 때문에 그 종류는 먹은것으로 생각하고 계산해도 됩니다.

left와 right를 k거리만큼 두고 한칸씩 이동합니다.
이동하면서 left의 위치에 있는것은 해당 종류의 초밥을 1개 덜 먹는것으로 하고
right의 위치에 있는것은 해당 종류의 초밥을 1개 더 먹는것으로 합니다.

1개 덜 먹는것으로 할 때 원래 가능한 개수가 2개이상이였으면 1개를 빼도 1개이상이 되므로
못 먹는것으로 판단하지 않습니다.

left가 n-1일때 까지 반복하며
해당 과정을 통해서 가장 많은 종류의 음식을 먹을때를 찾아서 출력해주었습니다.

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		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 ans = 0;
		int left = 0;
		int right = 0;
		int cnt = 0;
		int[] arr = new int[n];
		int[] eat = new int[d+1];
		
		for(int i=0; i<n; ++i) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		
		for(int i=0; i<k; ++i) {
			++eat[arr[right]];
			if(eat[arr[right]] == 1) {
				++cnt;
			}
			++right;
		}
		ans = cnt;
		
		while(left != n) {
			--eat[arr[left]];
			if(eat[arr[left]] == 0) {
				--cnt;
			}
			++left;
			
			++eat[arr[right]];
			if(eat[arr[right]] == 1) {
				++cnt;
			}
			++right;
			if(right == n) {
				right = 0;
			}
			if(eat[c] == 0) {
				ans = Math.max(ans, cnt + 1);
			} else {
				ans = Math.max(ans, cnt);
			}
		}
		
		bw.write(ans + "");
		bw.close();
	}
}

검색 태그