헝D의 일기장
article thumbnail

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

 

2531번: 회전 초밥

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

www.acmicpc.net

 

나의풀이

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));
        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[] eating = new int[d+1];	//먹은 초밥 종류 관련 배열
        eating[c] = 1;	//무료 초밥 먹은걸로 초기화. 
        int count = 1;	//무료 초밥이 1개 있으므로 default Value = 1
        int[] sushi = new int[N];
        

        for(int i=0;i<N;i++)
            sushi[i] = Integer.parseInt(br.readLine());

        //첫번째 슬라이드 
        for(int i=0;i<k;i++){
            int sushiId = sushi[i];
            if(eating[sushiId]==0)//안먹었으면 
                count++;
            eating[sushiId]++;
        }
        
        int max = count;

        for(int i=0;i<N-1;i++){
            int s_id = sushi[i];	//start
            int e_id = sushi[(i+k) % N];//end
            
            eating[s_id]--;
			if(eating[s_id]==0) 
				count--;
            
            if(eating[e_id]==0) 
				count++;
			eating[e_id]++;

            max = Math.max(max, count);	//최대값 비교
        }
        
        bw.write(String.valueOf(max));	
        bw.flush();		
        bw.close();
        br.close();
    }
}
profile

헝D의 일기장

@헝D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!