본문 바로가기

알고리즘/BAEKJOON

2531 회전초밥_Sliding Window

2531번: 회전 초밥 (acmicpc.net)

 

2531번: 회전 초밥

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

www.acmicpc.net

package Sliding_Window;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class Baekjoon_2531_회전초밥 {

	public static void main(String[] args) throws Exception {
		
		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[] sushi = new int[N];
		boolean[] visited = new boolean[d+1];
		for(int i = 0; i < N; i++) {
			sushi[i] = Integer.parseInt(br.readLine());
		}
		
		int result = Integer.MIN_VALUE;
		for(int i = 0; i < N; i++) {
			int cnt = 1;
			Arrays.fill(visited, false);
			
			for(int j = i; j < (i+k); j++) {
				if(!visited[sushi[j%N]]) {
					visited[sushi[j%N]] = true;
					cnt++;
					
					if(sushi[j%N] == c) cnt--;
 				}
			}
			if(cnt == k+1) {
				result = cnt;
				break;
			}
			result = Math.max(result, cnt);
		}

		System.out.println(result);
	}

}

'알고리즘 > BAEKJOON' 카테고리의 다른 글

21921 블로그_Sliding Window  (0) 2021.06.29
15565 귀여운 라이언_Two Pointers  (0) 2021.06.28
3273 두 수의 합_Two Pointers  (0) 2021.06.26
2018 수들의 합5_Two Pointers  (0) 2021.06.25
2617 구슬 찾기_Floyd Warshall  (0) 2021.06.24