백준 프린터 큐

KIMYEONGJUN·2025년 2월 13일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫 줄에 테스트케이스의 수가 주어진다. 각 테스트케이스는 두 줄로 이루어져 있다.
테스트케이스의 첫 번째 줄에는 문서의 개수 N(1 ≤ N ≤ 100)과, 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue에서 몇 번째에 놓여 있는지를 나타내는 정수 M(0 ≤ M < N)이 주어진다.
이때 맨 왼쪽은 0번째라고 하자.
두 번째 줄에는 N개 문서의 중요도가 차례대로 주어진다.
중요도는 1 이상 9 이하의 정수이고, 중요도가 같은 문서가 여러 개 있을 수도 있다.

각 테스트 케이스에 대해 문서가 몇 번째로 인쇄되는지 출력한다.

내가 이 문제를 보고 생각해본 부분

표준 입력을 읽기 위해 BufferedReader를 사용한다.
StringBuilder 객체를 생성한다.
테스트 케이스의 수를 입력받는다.
테스트 케이스 반복:
각 테스트 케이스에 대해 반복한다.
첫 번째 줄에서 문서의 개수 N과 몇 번째 문서를 확인할 것인지 M을 입력받는다.
두 번째 줄에서 문서의 중요도를 입력받아 큐에 저장한다.
큐 및 문서 처리:
문서의 인덱스와 중요도를 저장할 큐를 생성한다.
각 문서의 중요도를 큐에 추가해준다.
인쇄 순서 계산:
큐가 비어있지 않은 동안 반복한다.
현재 문서를 꺼내고, 큐에 남아있는 문서들 중 중요도가 더 높은 문서가 있는지 확인한다.
만약 중요도가 더 높은 문서가 있다면 현재 문서를 큐의 뒤로 재배치한다.
그렇지 않으면 출력한다.
결과 저장:
M번째 문서가 인쇄될 때, 그 순서를 StringBuilder에 추가한다.
결과 출력:
모든 테스트 케이스의 결과를 한 번에 출력한다.
System.out.print(sb.toString());를 사용하여 결과를 출력한다.

코드로 구현

package baekjoon.baekjoon_26;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

// 백준 1966번 문제
public class Main931 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder(); // 결과를 저장할 StringBuilder
        int testCases = Integer.parseInt(br.readLine());

        for(int t = 0; t < testCases; t++) {
            // 첫 번째 줄 입력 처리
            String[] firstLine = br.readLine().split(" ");
            int N = Integer.parseInt(firstLine[0]);
            int M = Integer.parseInt(firstLine[1]);

            // 두 번째 줄 입력 처리
            String[] priorities = br.readLine().split(" ");
            Queue<Document> queue = new LinkedList<>();

            for(int i = 0; i < N; i++) {
                int priority = Integer.parseInt(priorities[i]);
                queue.add(new Document(i, priority)); // 문서의 인덱스와 중요도를 저장
            }

            int printOrder = 0;

            while(!queue.isEmpty()) {
                Document current = queue.poll();
                boolean hasHigherPriority = false;

                for(Document doc : queue) {
                    if(doc.priority > current.priority) {
                        hasHigherPriority = true;
                        break;
                    }
                }

                if(hasHigherPriority) {
                    queue.add(current); // 중요도가 낮으면 재배치
                } else {
                    printOrder++;
                    if(current.index == M) {
                        sb.append(printOrder).append("\n"); // M번째 문서가 인쇄될 때 결과에 추가
                        break;
                    }
                }
            }
        }

        // 모든 결과를 한꺼번에 출력
        System.out.print(sb.toString());
        br.close();
    }

    static class Document {
        int index; // 문서의 원래 인덱스
        int priority; // 문서의 중요도

        Document(int index, int priority) {
            this.index = index;
            this.priority = priority;
        }
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글