T_era
[JAVA] 백준 1966 : 프린터 큐 본문
큐를 좀 더 연습하기 위해 찾은 문제
이전에 작성했던 큐에서 탐색관련 메서드를 만들어 작성했다
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;
}
}
'Programing > BaekJoon' 카테고리의 다른 글
| [JAVA] 백준 10845 : 큐 (0) | 2025.03.30 |
|---|---|
| [JAVA] 백준 11866 : 요세푸스 문제 (0) | 2025.03.30 |
| [JAVA] 백준 2164 : 카드2 (LinkedList 구현) (0) | 2025.03.30 |
| [JAVA] 백준 2164 : 카드2 (배열Queue) (0) | 2025.03.30 |
| [JAVA] 백준 1920 : 수찾기 (0) | 2025.03.30 |