알고리즘/BOJ (JAVA)

(JAVA) 백준 18258번 : 큐 2

띵킹 2022. 1. 25. 22:08

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

 

18258번: 큐 2

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

www.acmicpc.net

 

문제

정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

  • push X: 정수 X를 큐에 넣는 연산이다.
  • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 큐에 들어있는 정수의 개수를 출력한다.
  • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
  • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

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

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.


수업시간에 큐를 배웠기 때문에 구현에 큰 어려움이 없었....어야 했는데 계속 예제와 다른 결과가 나왔다.

분명 1, 2를 입력하고 front, back, size 하면 1,2,2가 나와야 하는데 10 2 0이 나오는 현상이 발생했다.

디버깅 과정에서 back 출력에 인덱스로 back-1을 해줘야 하는 걸 찾았지만 사실 그래도 10 2가 나올 원인은 아니었다.

back을 고치니 12 2가 나왔는데.... 또 한참을 코드를 쳐다봄....

10이 12로 바뀐 걸 보고 눈치 챘어야 했는데 front 출력에 개행을 빼먹었던 것....

10분이면 풀 문제를 대략 30분은 잡고 있었다. 

어제는 연속 20일 넘게 꾸준히 심던 github 잔디를 push 명령어 치는 걸 깜빡해서 끊어버렸는데 

정신 좀 바짝 차려야겠다는 생각이 든다. 

import java.io.*;

public class B_18258 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int N = Integer.parseInt(br.readLine());
        int[] queue = new int[N];
        int front = 0;
        int back = 0;
        int size = 0;
        for (int i=0;i<N;i++){
            String[] data = br.readLine().split(" ");
            if(data[0].equals("push")){
                queue[back++] = Integer.parseInt(data[1]);
                size++;
                if(back>=N) {
                    back = 0;
                }
            }
            else if(data[0].equals("pop")){
                if(size==0) {
                    bw.write("-1");
                    bw.newLine();
                }
                else {
                bw.write(Integer.toString(queue[front++]));
                bw.newLine();
                size--;
                if(front>=N) {
                    front = 0;
                }
            }
            }
            else if(data[0].equals("size")){
                bw.write(Integer.toString(size));
                bw.newLine();
            }
            else if(data[0].equals("empty")){
                if (size==0) {
                    bw.write("1");
                    bw.newLine();
                }
                else {
                    bw.write("0");
                    bw.newLine();
                }
            }
            else if(data[0].equals("front")){
                if (size==0) {
                    bw.write("-1");
                    bw.newLine();
                }
                else {
                    bw.write(Integer.toString(queue[front]));
                    bw.newLine();
                }
            }
            else if(data[0].equals("back")){
                if (size==0) {
                    bw.write("-1");
                    bw.newLine();
                }
                else {
                    bw.write(Integer.toString(queue[back-1]));
                    bw.newLine();
                }
            }
        }
        bw.flush();
        bw.close();
    }    
}

 

728x90