알고리즘

백준 28107번 회전초밥 (JAVA)

박카스마시며코딩 2023. 6. 17. 19:39

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

 

28107번: 회전초밥

회전 초밥 가게에 $N$명의 손님이 있고, 요리사는 $M$개의 초밥을 순서대로 만든다. 요리사가 초밥을 만들 경우, $1$번 손님부터 $N$번 손님의 순서대로 그 초밥을 받게 된다. 만약 먼저 초밥을 받는

www.acmicpc.net

 

저는 큐를 통해 문제를 해결했습니다.

각각의 스시번호에 따라 큐를 만들었고, 앞 번호를 먼저 넣고 스시가 나올 때 마다 해당하는 큐에서 꺼내서 해당하는 사람의 개수를 늘려 문제를 해결했습니다. 처음에는 Map을 이용해 문제를 해결하려고 했지만, 시간초과가 나왔습니다.

 

package BOJ.etc;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_28107 {
    private static final int MAX_SIZE = 200_000;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int m = stoi.apply(st.nextToken());
        Queue<Integer>[] q = new Queue[MAX_SIZE+1];
        for(int i = 0 ; i <= MAX_SIZE ; i++){
            q[i] = new LinkedList<>();
        }
        for(int i = 0 ; i < n ; i++){
            st = new StringTokenizer(br.readLine());
            int cnt = stoi.apply(st.nextToken());
            for(int j = 0 ; j < cnt ; j++){
                int num = stoi.apply(st.nextToken());
                q[num].add(i);
            }
        }
        st = new StringTokenizer(br.readLine());
        int[] cnt = new int[n];
        for(int i = 0 ; i < m ; i++){
            int sushi = stoi.apply(st.nextToken());
            if(!q[sushi].isEmpty()){
                cnt[q[sushi].poll()]++;
            }
        }
        for(int i = 0 ; i < n ; i++){
            System.out.print(cnt[i]+" ");
        }
    }
}