[BOJ] 18258번 큐2 - JAVA

최영환·2024년 5월 1일
0

💡 문제

💬 입출력 예시

📌 풀이(소스코드)

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

public class Main {

    static int[] queue = new int[2000001];
    static int start = 0, end = -1;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            String cmd = st.nextToken();

            if (cmd.equals("push")) {
                push(Integer.parseInt(st.nextToken()));
            } else if (cmd.equals("pop")) {
                sb.append(pop()).append("\n");
            } else if (cmd.equals("size")) {
                sb.append(size()).append("\n");
            } else if (cmd.equals("empty")) {
                sb.append(empty()).append("\n");
            } else if (cmd.equals("front")) {
                sb.append(front()).append("\n");
            } else if (cmd.equals("back")) {
                sb.append(back()).append("\n");
            }
        }

        System.out.println(sb);
    }

    private static void push(int x) {
        queue[++end] = x;
    }

    private static int pop() {
        if (size() == 0) {
            return -1;
        }
        return queue[start++];
    }

    private static int size() {
        return end - start + 1;
    }

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

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

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

📄 해설

접근

  • 라이브러리를 사용해서 풀이하는 것이 목표가 아닌 문제. 정수형 배열로 큐를 구현했다.
  • 앞서 풀이했던 스택 문제와는 자료구조에 대한 차이만 있으므로, 역시 큐에 대한 이해도가 있다면 쉽게 해결이 가능할 것이다.
  • 문제에서 제시하는 조건에 맞는 명령들을 전부 메소드로 구현했다.

과정

  • 사용한 변수들을 살펴보면 스택과 약간의 차이가 존재한다. 스택은 스택의 Top을 가리키는 인덱스 변수 하나만으로 관리가 가능하지만, 큐의 경우는 startend 라는 두개의 변수를 사용하여 관리하고 있는데, 이는 각각 큐의 frontrear 를 가리킨다. 각각 0 과 -1 로 초기화하고 사용했다.
  • 각 메소드들에 대한 설명만을 작성하도록 하겠다. 솔직히 설명이 필요한 메소드들도 아니라고 생각한다.
  • push(int x) : 큐의 end 인덱스를 증가시키고, 그 위치에 x 를 넣는다.
  • pop() : start 인덱스의 값을 출력하고, 인덱스를 증가시킨다. 큐는 앞에서 원소가 빠지는 구조이다. 그리고 이를 start 인덱스를 증가시킴으로써 빠져나간것처럼 구현했다. 큐가 비어있으면 -1 을 반환해야하므로 아래에서 설명할 size() 메소드를 재사용했다.
  • size() : 맨 마지막 원소의 인덱스 - 맨 처음 원소의 인덱스 + 1 이 되어야 큐의 크기가 나온다.
  • empty() : 큐가 비어있는지 아닌지를 확인하기 위해 size() 메소드를 재사용했다. size() 메소드의 반환 값이 0이면 1을 반환하고, 그렇지 않으면 0을 반환한다.
  • front() : 현재 큐의 start 인덱스에 있는 값을 반환한다. 역시 size() 메소드를 사용하여 비어있는지 여부를 확인한다.
  • back() : 현재 큐의 end 인덱스에 있는 값을 반환한다. 역시 size() 메소드를 사용하여 비어있는지 여부를 확인한다.
profile
조금 느릴게요~

0개의 댓글