Programing/BaekJoon

[JAVA] 백준 11866 : 요세푸스 문제

블스뜸 2025. 3. 30. 22:15

이전에 작성했던 큐에는 치명적인 문제가 있었다 main에서 while 조건으로 노드가 비었는지 체크하는데
pop을 하고 다음 노드가 없을 때 head와 tail을 null로 변환되지않고 있었다.
그 부분을 수정하고 풀었다 

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;

        NodeManager nodeManager = new NodeManager();

        st = new StringTokenizer(br.readLine());
        int person = Integer.parseInt(st.nextToken());
        int order = Integer.parseInt(st.nextToken());

        for (int i = 1; i <= person; i++) {
            nodeManager.push(new QueueNode(i));
        }

        bw.write("<");

        while (!nodeManager.isEmpty()) {
            for (int i = 0; i < order - 1; i++) {
                nodeManager.push(nodeManager.pop());
            }
            bw.write(nodeManager.pop().getValue() + (nodeManager.isEmpty() ? "" : ", "));
        }

        bw.write(">");
        bw.flush();
        bw.close();
        br.close();
    }
}

class QueueNode {
    int value;
    QueueNode nextNode;

    public QueueNode(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public QueueNode getNextNode() {
        return nextNode;
    }

    public void setNextNode(QueueNode node) {
        nextNode = node;
    }
}

// push, pop, peek, empty
class NodeManager {
    QueueNode head, tail;

    public NodeManager() {
        head = tail = null;
    }

    public boolean isEmpty() {
        return head == null;
    }

    public void push(QueueNode node) {
        if (isEmpty()) {
            head = tail = node;
        } else {
            tail.setNextNode(node);
            tail = tail.getNextNode();
        }
    }

    public QueueNode pop() {
        if (isEmpty()) return null;
        QueueNode node = head;
        if(head == tail){
            head = null;
            tail = null;
        }else{
            head = head.getNextNode();
        }
        return node;
    }

    public QueueNode peek() {
        if (isEmpty()) return null;
        return head;
    }
}