1966번: 프린터 큐

wnajsldkf·2022년 10월 9일
0

Algorithm

목록 보기
4/58
post-thumbnail

설명

  • 프린트 할 문서들이 존재하지 않을 때까지, 중요도가 높은 문서를 만나면 맨 앞의 문서를 맨 뒤로 보낸다.
    • poll() 된 원소의 중요도가 가장 큰 경우: 해당 원소의 첫 위치가 M이랑 같은지 비교
    • poll() 된 원소보다 더 큰 중요도가 있는 경우: poll()된 원소와 더 큰 중요가 앞에있는 원소들을 모두 뒤로 보냄
  • 문서들의 첫 위치와 중요도를 함께 저장한다.

코드

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class P1966 {
	static int T;
    static int N, M;
    public static void main(string[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputSreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        // 테스트 케이스
        T = Integer.parseInt(st.nextToken());
        
        for(int t = 0; t < T; t++) {
        	st = new StringTokenizer(br.realLine());
            N = Integer.parseInt(st.nextToken());
            M = Integer.parseInt(st.nextToken());
            
            // 이동 횟수를 저장할 변수
            int count = 0;
            
            // 큐로 활용할 연결 리스트를 만든다. 초기위치와 중요도를 함께 저장하기 위해 배열을 사용한다.
            LinkedList<int[]> docs = new LinkedList<>();
            
            st = new StringTokenizer(br.readLine());
            for(int j =0; j < N; j++) {
            	// j: 초기위치, Integer.parseInt(st.nextToken()): 중요도
                docs.add(new int[]{j, Integer.parseInt(st.nextToken())});
            }
            
            // 프린트 큐에서 더이상 뽑을 것이 없을 때까지 반복한다.
            while(!docs.isEmpty()){
            	int[] front = docs.poll();	// 가장 앞에 있는 원소를 뽑는다. -> 이 원소는 맨 뒤로 이동하거나, 프린트에서 뽑기 때문에 뽑아온다.
                boolean isMax = true;		// 가장 큰 원소인지 관리
                
                // 큐에 남아있는 원소들과 중요도를 비교한다.
                for(int k = 0; k < docs.size(); k++){
                	if(front[1] < docs.get(k)[1]){
                    	// 뽑은 원소 및 k 이전의 원소들은 뒤로 보낸다.
                        docs.offer(front);
                        for(int l = 0; l < k; l++){
                        	docs.offer(docs.poll());
                        }
                        
                        // front 원소가 가장 큰 원소가 아니므로 false로 지정하고 탐색한다.
                        isMax = false;
                        break;
                    }
                }
                
                // Front 원소가 가장 큰 원소가 아니므로 다음 반복문으로 이동한다. 
                if(isMax == false) {
                	continue;
                }
                count++; 	// 뭐든 하나는 출력된 것이니 count를 늘린다..
              
                // 출력하는 문서가 찾고자 하는 문서이면 해당 테스트 케이스를 종료한다.
                if(front[0] == M){
                	break;
                }
            }
            sb.append(count).append('\n');
        }    
        System.out.println(sb);
 	}          
}

아이디어는 쉽게 떠올렸지만 종료조건과 반복문을 어디에서 할 것인지 정하는데 어려움이 있었다.

profile
https://mywnajsldkf.tistory.com -> 이사 중

0개의 댓글