알고리즘
백준 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]+" ");
}
}
}