본문 바로가기

백준문제풀이

2022.06.22 백준 Q10845

학습 내용 : 큐 구현, 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