본문 바로가기

IT/JAVA

백준 코딩 18258 : 큐

반응형

문제

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

명령은 총 여섯 가지이다.

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

입력

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

출력

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

 

예전에 풀었던 Stack과 마찬가지로 ArrayList를 통해 Queue를 구현해보려고 하였으나 계속 시간초과가 떠서 결국 Queue <E> 인터페이스를 사용했다.

BufferedReader, BufferedWriter 및 StringTokenizer까지 다 이용했는데도 시간초과가 떳던 이유는 ArrayList의 remove() 메소드가 List의 길이가 긴 경우에는 직접 그 곳까지 찾아가는데 시간이 오래걸리기 때문이다.

따라서 Queue를 구현하는데 ArrayList를 이용하는 것은 적합하지 못하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
    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());
        Queue<Integer> queue = new LinkedList<Integer>();
        //ArrayList<Integer> arr = new ArrayList<Integer>(); --> ArrayList 사용 X
        String str = null;
        String command = null;
        int rear = 0/* 
                      Queue는 해당 큐의 맨 뒤에 있는 요소를 반환하는 메소드가 없으므로
                      push명령어를 입력해서 맨 마지막에 입력되는 값을 rear로 저장해놓고  
                      back명령어를 입력했을때 저장된 rear값을 출력하도록 한다.*/
 
        for (int i = 0 ; i < N ; i++) {
            str = br.readLine();
            StringTokenizer st = new StringTokenizer(str);
            //split사용시 시간초과 -> StringTokenizer 사용
            command = st.nextToken();
            if (command.equals("push"&& st.hasMoreTokens()) {
                int value = Integer.parseInt(st.nextToken());
               queue.add(value);
                rear = value;
            } else if (command.equals("front")) {
                if (!queue.isEmpty()) {
                   bw.write(queue.peek()+"\n");
                } else {
                    bw.write(-1+"\n");
                }
            }else if (command.equals("back")) {
                if (!queue.isEmpty()) {
                    bw.write(rear+"\n");
                    //back 명령어 입력 시 push에서 저장된 rear값을 출력
                } else {
                    bw.write(-1+"\n");
                }
            } else if (command.equals("pop")) {
                if (!queue.isEmpty()) {
                   bw.write(queue.poll()+"\n");
                } else {
                    bw.write(-1+"\n");
                } 
            } else if (command.equals("empty")) {
                if (queue.isEmpty()) {
                    bw.write(1+"\n");
                }else {
                    bw.write(0+"\n");
                }
            } else if (command.equals("size")) {
               bw.write(queue.size()+"\n");
            } else {
                System.exit(0);
            }
        }
        bw.flush();
        bw.close();
        br.close();
    }
}
 
 
 
 
 
 
 
cs

 

참고클래스로 구현된 스택과는 달리 자바에서 큐 메모리 구조는 별도의 인터페이스 형태로 제공된다.

        Queue 인터페이스는 메모리 구조를 표현하기 위해, 다음과 같은 Collection 인터페이스 메소드만을

        상속받아 사용한다.

 

       

메소드 설명
boolean add(E e) 해당 큐의 뒤에 전달된 요소를 삽입한다.
 
만약 삽입에 성공하면 true 반환하고, 큐에 여유 공간이 없어 삽입에 실패하면
 IllegalStartException 발생시킨다.
E peek() 해당 큐의 앞에 있는 (제일 먼저 저장된) 요소를 반환한다.
만약 큐가 비어있으면 null 반환한다.
E poll() 해당 큐의 앞에 있는 (제일 먼저 저장된) 요소를 반환하고, 해당 요소를 큐에서 제거한다.
 만약 큐가 비어있으면 null 반환한다.
반응형