반응형
문제
정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여섯 가지이다.
- 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을 반환한다. |
반응형
'IT > JAVA' 카테고리의 다른 글
백준 코딩 15649 : 백트래킹(N과 M 1) (0) | 2020.09.04 |
---|---|
백준 코딩 15651 : 백트래킹 (N과 M 3) (0) | 2020.09.03 |
백준 코딩 2775 : 부녀회장이 될테야 (0) | 2020.09.01 |
백준 코딩 10250 : ACM 호텔 (0) | 2020.08.31 |
백준 코딩 2869 : 달팽이는 올라가고 싶다. (0) | 2020.08.30 |