티스토리 뷰

728x90

문제

- 프린터 기기는 인쇄하고자 하는 문서를 인쇄 명령을 받은 순서대로, 즉 먼저 요청된 것을 먼저 인쇄(FIFO, First In First Out)

- 상근이는 새로운 프린터기 내부 소프트웨어를 개발. 조건은 아래와 같음

   1. 현재 Queue의 가장 앞에 있는 문서의 중요도 확인

   2. 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 Queue의 가장 뒤로

   3. 그렇지 않다면 바로 인쇄

- 현재 Queue에 있는 문서의 수와 중요도가 주어졌을 때, 어떤 한 문서가 몇 번째로 인쇄되는지 알아내는 것이 목표

 

해결방법

입력 받은 문서의 중요도와 인쇄 순서를 LinkedList에 저장하여 각 문서를 관리하도록 하였다. 처음 입력을 받으면서 M 번째에 있는 문서를 출력하는 순서를 알아내는 것이 목표이기 때문에 초기에 입력받은 순서를 함께 저장할 수 있도록 한 것이다.

Queue에서 동작하는 대로 처음 것을 뽑아낸 뒤 해당 문서의 중요도보다 높은 문서가 있으면 계속해서 뽑아내서 뒤에 다시 넣어줄 수 있도록 하였다. 이렇게 반복하면서 가장 큰 중요도를 가진 문서를 뽑아낼 때에는 count를 증가하여 몇 번째로 뽑아내는 것인지 알아낼 수 있도록 하였고, 뽑아내는 문서의 초기 위치가 M이라면 count를 출력할 수 있도록 하였다.

 

코드

import java.io.*;
import java.util.*;

class Main{
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int T = Integer.parseInt(br.readLine());		// 테스트 케이스 수

        for(int tc = 1; tc<=T; tc++){
            int count = 0;					// 몇 번째로 인쇄되는지 카운팅할 수 있는 변수
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int N = Integer.parseInt(st.nextToken());		// 문서의 개수
            int M = Integer.parseInt(st.nextToken());		// 몇 번째로 인쇄되었는지 궁금한 문서의 현재 위치
            LinkedList<int[]> queue = new LinkedList<>();	// 프린터 큐

            st = new StringTokenizer(br.readLine(), " ");
            for(int i = 0; i<N; i++){
            	// 초기 위치, 중요도 프린터 큐에 삽입
                queue.add(new int[] {i, Integer.parseInt(st.nextToken())});
            }

            while(!queue.isEmpty()){
                int[] first = queue.pollFirst();	// 첫 번째에 위치한 문서 정보
                boolean isMax = true;			// 중요도가 최대인지 판단하는 변수

                for(int i = 0; i<queue.size(); i++) {
                    // 중요도가 더 높은 문서가 존재한다면 아래와 같이 동작
                    if (first[1] < queue.get(i)[1]){
                        queue.add(first);		// 뽑아논 문서를 맨 뒤로 삽입
                        for(int j = 0; j<i ;j++){
                            // 중요도가 더 높은 문서 직전까지 존재하는 문서들을 다시 뒤로 삽입
                            queue.add(queue.pollFirst());
                        }
                        isMax = false;		// 지금 뽑아논 문서는 중요도가 가장 크지 않음
                        break;
                    }
                }

                if(!isMax) continue;			// 중요도가 가장 크지 않다면 다시 반복

                count++;				// 중요도가 크다면 프린트 진행 -> 인쇄 횟수 증가
                if(first[0] == M){			// 초기 위치가 원하는 M번째 문서라면
                    sb.append(count).append("\n");	// 인쇄 횟수 출력
                    break;
                }
            }
        }
        System.out.println(sb);
    }
}
728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

[백준] 2108번 통계학(JAVA)  (0) 2022.07.14
[백준] 1978번 소수 찾기(JAVA)  (0) 2022.07.14
[백준] 1929번 소수 구하기(JAVA)  (0) 2022.07.12
[백준] 1920번 수 찾기(JAVA)  (0) 2022.07.10
[백준] 1874번 스택 수열(JAVA)  (0) 2022.07.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday