백준 프린터 큐

KIMYEONGJUN·2025년 2월 13일
0
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개의 댓글

관련 채용 정보