T_era

[JAVA] 백준 1966 : 프린터 큐 본문

Programing/BaekJoon

[JAVA] 백준 1966 : 프린터 큐

블스뜸 2025. 3. 30. 21:27

큐를 좀 더 연습하기 위해 찾은 문제
이전에 작성했던 큐에서 탐색관련 메서드를 만들어 작성했다

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int count = Integer.parseInt(br.readLine());
        for (int i = 0; i < count; i++) {
            NodeManager nodeManager = new NodeManager();
            st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken()); // 문서의 갯수
            int m = Integer.parseInt(st.nextToken()); // 원하는 탐색 위치
            st = new StringTokenizer(br.readLine()); // 문서의 중요도들
            for (int j = 0; j < n; j++) {
                int temp = Integer.parseInt(st.nextToken());
                nodeManager.push(new QueueNode(j, temp)); // 문서의 위치번호와 중요도 삽입
            }
            int targetNum = 1;
            while (!nodeManager.isEmpty()) {
                QueueNode current = nodeManager.pop();	// 탐색할 노드 가져오기
                boolean isMax = true;
                for (int j = 0; j < nodeManager.getSize(); j++) {
                	// 현재보다 높은 중요도값 발견시 노드 push 후 반복종료
                    if (nodeManager.peek(j).getImportance() > current.getImportance()) {	
                        nodeManager.push(current);
                        isMax = false;
                        break;
                    }
                }
                // 높은 중요도 값 발견하지 못하면 원하는 M값과 현재 탐색 중인 노드의 M을 비교하여
                // 참이면 출력한 현재순서(targetNum) 출력대기
                // 거짓이면 targetNum 증가
                if (isMax) {
                    if (current.getPosition() == m) {
                        bw.write(targetNum + "\n");
                        break;
                    } else {
                        targetNum++;
                    }
                } else {
                	// 높은 중요도 값 발견 시 현재 노드 push하고 다음 노드로 반복 시작
                    nodeManager.push(current);
                }
            }
        }
        bw.flush();
        bw.close();
        br.close();
    }
}
class QueueNode{
    int position;
    int importance;
    QueueNode nextNode;

    public QueueNode(int position, int importance){
        this.position = position;
        this.importance = importance;
        nextNode = null;
    }
    public int getPosition(){
        return position;
    }
    public int getImportance(){
        return importance;
    }
    public QueueNode getNextNode(){
        return nextNode;
    }
    public void setNextNode(QueueNode node){
        nextNode = node;
    }
}
// size, pop, push, empty, peek
class NodeManager{
    QueueNode head, tail;
    int size = 0;
    public NodeManager(){
        head = tail = null;
    }
    public boolean isEmpty(){
        if(head == null && tail == null) return true;
        else return false;
    }
    public void push(QueueNode node){
        if(isEmpty()) head = tail = node;
        else {
            tail.setNextNode(node);
            tail = tail.getNextNode();
        }
        size++;
    }
    public QueueNode pop(){
        if(isEmpty()) return null;
        QueueNode node = head;
        head = head.getNextNode();
        size--;
        if (head == null) {
            tail = null;
        }
        return node;
    }
    public QueueNode peek(int index) {
        if (isEmpty()) {
            return null;
        }
        QueueNode current = head;
        for (int i = 0; i < index; i++) {
            current = current.nextNode;
        }
        return current;
    }
    public QueueNode peek(){
        if(isEmpty()) return null;
        return head;
    }
    public int getSize(){
        return size;
    }
}