백준 문제풀이

[백준] 10845번 큐 [JAVA]

늦깍이 2022. 9. 13. 18:12

https://www.acmicpc.net/problem/10845

 

10845번: 큐

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net


     문제

     문제 풀이

  • 백준 10828번 스택과 매우 유사한 구현 문제이다.
  • 큐(queue)와 스택(stack)의 차이를 알고 있다면 구현에 어려움은 없을 것이다.
    큐와 스택의 차이는 큐는 FIFO(First In, First Out), 스택은 LIFO(Last In, First Out), 즉 선입선출, 후입선출의 차이가 있다는 걸 알아야한다.
    LIFO : 스택의 후입 선출은 들어온게, 제일 먼저 나간다. 즉 맨 위에 얹어지는 값만 알고 있으면 모두 구현이 가능하다.
    FIFO : 큐의 선입 선출은 맨 먼저 들어온게 제일 먼저 나가고, 제일 늦게 들어온게 제일 늦게 나가는, 즉 줄서기와 같이 순서가 정해져있는 자료구조이다. 그렇다면 맨 먼저 들어온 자료의 정보와 제일 늦게 들어온 자료의 정보를 모두 알아야 구현이 가능할 것이다.
  • 푼 방법
    1. 배열로 구현하도록 한다.
    2. 입력 조건 중 1 부터 10000까지라는 조건이 있으므로 배열의 크기는 10001으로 설정하였다.
    3. push와 pop을 할 때, 동작을 한 이후 push의 경우 back와 size를, pop의 경우 front와 size를 더해주는 것을 잊지말자. 
    4. back() 명령의 경우 주의해야한다. back은 현재 가장 뒤에 있는 자료를 가르키는 것이 아닌, 가장 뒤에 있는 자료의 그 다음 인덱스를 가르킨다. 따라서 back() 명령을 통해 가장 뒤에 있는 자료를 출력하려면 queue[back - 1]을 출력해야한다.

        JAVA code

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class baekjoon10845 {
    public static int[] queue = new int[10001];
    public static int size = 0;
    public static int front = 0;
    public static int back = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String S = st.nextToken();
            int ret;
            switch (S) {
                case "push":
                    push(Integer.parseInt(st.nextToken()));
                    break;
                case "pop":
                    ret = pop();
                    System.out.println(ret);
                    break;
                case "size":
                    ret = size();
                    System.out.println(ret);
                    break;
                case "empty":
                    ret = empty();
                    System.out.println(ret);
                    break;
                case "front":
                    ret = front();
                    System.out.println(ret);
                    break;
                case "back":
                    ret = back();
                    System.out.println(ret);
                    break;
            }
        }
    }

    public static void push(int item) {
        queue[back] = item;
        back++;
        size++;
    }

    public static int pop() {
        if (size == 0)
            return -1;
        else {
            int ret = queue[front];
            front++;
            size--;
            return ret;
        }
    }

    public static int size() {
        return size;
    }

    public static int empty() {
        if (size == 0)
            return 1;
        else
            return 0;
    }

    public static int front() {
        if (size == 0)
            return -1;
        else
            return queue[front];
    }

    public static int back() {
        if (size == 0)
            return -1;
        else
            return queue[back - 1];
    }
}