백준 2531: 회전 초밥

uni.gy·2024년 3월 27일
1

알고리즘

목록 보기
56/61

문제

풀이

  • 처음에 Set을 이용하여 구현했지만, 집합에 같은 번호 스시가 여러개 포함되어 있을 때 remove를 하면 한번에 삭제되는 문제가 있었다.
  • 그래서 DAT로 변경하여 개수로 체크해줬다.
  • 원형을 고려해서 인덱스를 % n 을 해줘서 인덱스 에러 방지

코드

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

public class Main {

    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[] sushi=new int[n];
        for(int i=0;i<n;i++)sushi[i]=Integer.parseInt(br.readLine());

        int[] dat=new int[d+1];
        int max=0;
        for(int i=0;i<k;i++){
            if(dat[sushi[i]]==0)max++;
            dat[sushi[i]]++;
        }
        int cnt=max;
        for(int i=1;i<=n;i++){
            dat[sushi[i-1]]--;
            if(dat[sushi[i-1]]==0)cnt--;
            if(dat[sushi[(i+k-1)%n]]==0)cnt++;
            dat[sushi[(i+k-1)%n]]++;
            if(dat[c]==0)max=Math.max(max,cnt+1);
            else max=Math.max(max,cnt);
        }
        System.out.println(max);
    }
}

#슬라이딩윈도우

profile
한결같이

0개의 댓글