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;
}
}