코딩문제풀이/Baekjoon

[Java] 백준 2531번 : 회전 초밥

코딩하는 포메라니안 2023. 4. 3. 12:14

문제

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

 

2531번: 회전 초밥

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

www.acmicpc.net

 

풀이과정

각 번호별로 먹은 횟수를 1차원 배열에 기록했다. 여기서 인덱스는 음식의 번호를 의미한다.

이 문제에서는 K개라는 window크기가 정해져있으므로 window를 한칸씩 오른쪽으로 움직여가며 값을 계산했다. window가 옮겨질 때는 window맨 첫번째 수를 빼주고 다음 수를 하나 더해주는 방식으로 진행한다.

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

public class Main {
    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());
        st.nextToken();
        int K = Integer.parseInt(st.nextToken());
        int C = Integer.parseInt(st.nextToken());
        int[] plates = new int[N];
        int[] record = new int[3001];//번호별 먹은 횟수

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

        int cnt = 1;
        record[C] = 1;
        for(int i=0; i<K; i++){
            if(record[plates[i]]++ == 0){
                cnt++;
            }
        }

        int result = cnt;
        if(N!=K){
            for(int i=0; i<N-1; i++){
                if(--record[plates[i]] == 0) cnt--;
                if(record[plates[(i+K)%N]]++ == 0) cnt++;
                result = Math.max(result, cnt);
            }
        }

        System.out.println(result);
    }
}

 

결과