학습 내용 : 큐 구현, push.pop.front.back.size 구현
이 문제는 Queue에 있는 각종 함수를 실제 구현해보는 문제이다.
Queue는 FIFO 방식으로 처음 넣은 값이 먼저 삭제됩니다. Queue를 구현할때 pop할 때 필요한 제일 먼저 넣은 값의 위치(front)와 push할 때 저장할 위치(back)가 필요하기 때문에 front와 back을 queue의 멤버로 설정했다.
각 값은 QueueNode로 하나하나의 데이터를 만들어줬다.
실수한 부분
Queue의 개념의 혼돈으로 stack 구조로 만들었었다(큐는 단방향 구조라 pre 필요없이 next만 있으면 된다).
int pop(){
if(front!=null){
int data = front.getData();
front = front.getNext();
size--;
if(size==0){back=null;}
return data;
}
return -1;
}
-위 코드에서 front가 하나의 노드만 있는 상태에서 pop을 하게 되면 front값만 바꿔주는 것이 아니라 back에 있는 값도 삭제시켜줘야한다.
새로 배운 배용
(-->0)을 통해 count를 1씩 줄이고 0보다 클때만 루프가 돌게 하는 방법을 배웠다.
BufferReader : scanner를 통해 값을 입력받는 것보다 빠른 속도로 받을 수 있다(입력된 값이 바로 전달되지 않고 버퍼를 통해 한번에 들어와 효율이 좋다.)
-큐 실제 구현 코드-
package BaekJoon10845;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class QueueNode{
private int data;
private QueueNode next;
QueueNode(int num){
data=num;
next = null;
}
void setNext(QueueNode newNode){next = newNode;}
QueueNode getNext(){return next;}
int getData(){return data;}
}
class Queue{
private QueueNode front; //큐의 해드
private QueueNode back; //큐의 마지막 노드
private int size=0;
Queue(){
front = null;
back = null;
size = 0;
}
int getSize(){
return size;
}
void push(int num){
QueueNode q = new QueueNode(num);
if(front!=null){
back.setNext(q);
}else{
front=q;
}
back=q;
size++;
}
int pop(){
if(front!=null){
int data = front.getData();
front = front.getNext();
size--;
if(size==0){back=null;}
return data;
}
return -1;
}
int front(){
if(front!=null){
return front.getData();
}
return -1;
}
int back(){
if(front!=null){
return back.getData();
}
return -1;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int commandCount = Integer.parseInt(bf.readLine());
Queue q = new Queue();
while(commandCount-->0){
String command=bf.readLine();
String[] commands = command.split(" ");
switch (commands[0]){
case "push":
q.push(Integer.parseInt(commands[1]));
break;
case "pop":
int checkPop = q.pop();
System.out.println(checkPop);
break;
case "size":
System.out.println(q.getSize());
break;
case "empty":
if(q.getSize()==0){System.out.println("1");}
else{System.out.println("0");}
break;
case "front":
System.out.println(q.front());
break;
case "back":
System.out.println(q.back());
break;
default:
}
}
}
}
-큐 API 사용 코드
package BaekJoon10845;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class MakeQueueWIthAPI {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
Queue<Integer> q = new LinkedList<>();
int commandCount = Integer.parseInt(bf.readLine());
int lastData = -1;
while(commandCount-->0){
String command=bf.readLine();
String[] commands = command.split(" ");
switch (commands[0]){
case "push":
q.offer(Integer.parseInt(commands[1]));
lastData = Integer.parseInt(commands[1]);
break;
case "pop":
if(q.isEmpty()) System.out.println("-1");
else{
System.out.println(q.poll());
}
break;
case "size":
System.out.println(q.size());
break;
case "empty":
if(q.isEmpty()){System.out.println("1");}
else{System.out.println("0");}
break;
case "front":
if(q.isEmpty()) {
System.out.println("-1");
}else{
System.out.println(q.peek());
}
break;
case "back":
if(q.isEmpty()) {
System.out.println("-1");
}else{
System.out.println(lastData);
}
break;
default:
}
}
}
}
'백준문제풀이' 카테고리의 다른 글
2022.06.27 백준 Q11651 (0) | 2022.06.27 |
---|---|
2022.06.26 백준 Q11650 (0) | 2022.06.27 |
2022.06.25 백준 Q2805 (0) | 2022.06.25 |
2022.06.24 백준 Q1260 (0) | 2022.06.25 |
2022.06.23 백준 Q15649 (0) | 2022.06.23 |