문제
회전 초밥 가게에 N명의 손님이 있고, 요리사는 M개의 초밥을 순서대로 만든다. 요리사가 초밥을 만들 경우, 1번 손님부터 N번 손님의 순서대로 그 초밥을 받게 된다. 만약 먼저 초밥을 받는 손님이 초밥을 먹을 경우, 뒤의 손님들은 해당 초밥을 먹을 수 없다. 만약 아무도 해당 초밥을 먹지 않는다면, 초밥은 버려진다.
N명의 손님은 각자 먹고 싶은 초밥이 적힌 주문 목록을 가지고 있다. 목록에 적힌 초밥의 순서에 상관 없이 만약 목록에 적혀있는 초밥이 앞에 오면 반드시 먹는다. 만약, 목록에 적히지 않은 초밥을 받는다면 그 초밥은 반드시 먹지 않는다. 단, 손님들은 다양한 초밥을 먹고 싶어하기 때문에 각 종류의 초밥은 최대 한 번만 먹는다.
각 손님의 주문 목록과 순서대로 만들어지는 M개의 초밥이 주어질 때, 각 손님이 먹게 되는 초밥의 개수를 구해 보자.
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 Main {
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]+" ");
}
}
}
728x90
'Study > 코딩스터디_TIL' 카테고리의 다른 글
[java 스터디] 문제풀이 11286번 java 백준 (0) | 2025.02.13 |
---|---|
[java 스터디] 문제풀이 Result506. Relative Ranks (0) | 2025.02.11 |
[java 스터디] 우선순위 큐 (0) | 2025.02.10 |
[java] 큐 활용 문제풀이 백준 4949번 균형잡힌 세상 (0) | 2025.02.08 |
[java] 큐 활용 문제풀이 백준 26043번 식당메뉴 (0) | 2025.02.06 |