뚱땅뚱땅

[문제] 백준 1966번 프린터 큐 본문

알고리즘/백준

[문제] 백준 1966번 프린터 큐

양순이 2021. 2. 11. 05:56
728x90

www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net

내 풀이

 

public class BOJ_1966 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();

		int T = Integer.parseInt(in.readLine());

		for (int t = 0; t < T; t++) {
			int res = 0;
			st = new StringTokenizer(in.readLine());
			int N = Integer.parseInt(st.nextToken()); // 문서 개수
			int M = Integer.parseInt(st.nextToken()); // 궁금한 인덱스 번호

			Queue<int[]> q = new LinkedList<>();
			List<Integer> list = new ArrayList<>();	// 최대값 찾는 용의 리스트
			int cnt = 0, idx = 0; // cnt: 인쇄가 몇번 됐는지, idx: list 순회용 인덱스

			st = new StringTokenizer(in.readLine());
			for (int i = 0; i < N; i++) {
				int num = Integer.parseInt(st.nextToken());
				list.add(num);
				q.offer(new int[] { i, num }); // i: 문서 인덱스 num: 중요도
			}
			Collections.sort(list, Collections.reverseOrder()); // 내림차순 정렬

			while (!q.isEmpty()) {
				if (list.get(idx) != null && q.peek()[1] == list.get(idx)) {// 중요도 바교
					cnt++;	// q.peek()에 있는걸 인쇄할 수 있으니 cnt 증가
					idx++;	// 다음 최대값 찾을 수 있도록 list의 idx 증가
                    
					if (q.peek()[0] == M) {	// 찾고자 하는 인덱스 넘버라면 cnt 반환
						res = cnt;
						break;
					}
					q.poll();
                    
				}else {
					q.offer(q.poll());	//q 앞에 있는걸 뒤로 삽입
				}
				
			}
			System.out.println(res);

		}

	}
}
728x90
Comments