정수를 저장하는 덱을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여덟 가지이다.
1 X
: 정수X
를 덱의 앞에 넣는다. (1 ≤ X ≤ 100,000)2 X
: 정수X
를 덱의 뒤에 넣는다. (1 ≤ X ≤ 100,000)3
: 덱에 정수가 있다면 맨 앞의 정수를 빼고 출력한다. 없다면-1
을 대신 출력한다.4
: 덱에 정수가 있다면 맨 뒤의 정수를 빼고 출력한다. 없다면-1
을 대신 출력한다.5
: 덱에 들어있는 정수의 개수를 출력한다.6
: 덱이 비어있으면1
, 아니면0
을 출력한다.7
: 덱에 정수가 있다면 맨 앞의 정수를 출력한다. 없다면-1
을 대신 출력한다.8
: 덱에 정수가 있다면 맨 뒤의 정수를 출력한다. 없다면-1
을 대신 출력한다.
첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)
둘째 줄부터 N개 줄에 명령이 하나씩 주어진다.
출력을 요구하는 명령은 하나 이상 주어진다.
출력을 요구하는 명령이 주어질 때마다 명령의 결과를 한 줄에 하나씩 출력한다.
✅ 덱(Dequeue)이란 선입선출, 후입선출 방식이 아닌 양방향으로 삽입, 삭제가 모두 가능한 자료구조이다. 선언 및 사용법이 큐와 비슷한데, 기본적으로 큐에서 사용하는 메서드에 앞쪽 값을 활용하면
First
를, 뒤쪽 값을 활용하면Last
를 붙여주면 쉽게 활용할 수 있다.
이번 문제는 앞서 풀었던 스택 2, 큐 2와 같은 유형으로, switch ~ case문을 사용하여 각 명령어order
에 해당하는 작업을 수행하면 된다.
1
,2
: 처리해야 할 명령어가 2개이므로 Stringtokenizer를 통해 전달받은 정수를offer()
메서드를 사용하여d
에 넣는다. 두 명령어는 따로 출력을 요구하지 않으므로 값을result
에 저장할 필요는 없다.
➡️1
:offerFirst()
(앞) /2
:offerLast()
(뒤)
3
,4
:d
가 비어어있으면-1
, 비어있지 않다면poll()
메서드를 사용하여 값을 꺼낸 후result
에 저장한다.
➡️3
:pollFirst()
(앞) /4
:pollLast()
(뒤)
5
:size()
메서드를 사용하여d
에 저장된 정수의 개수를result
에 저장한다.
6
:isEmpty()
메서드를 사용하여d
가 비어있으면1
, 비어있지 않으면0
을result
에 저장한다.
7
,8
:d
가 비어있으면-1
, 비어있지 않다면peek()
메서드를 사용하여 값을result
에 저장한다.
➡️7
:peekFirst()
(앞) /8
:peekLast()
(뒤)
조건 판별이 종료되면result
의 값이 초기값인-2
가 아닌 경우에만 결과값을 출력한다.
import java.io.*;
import java.util.*;
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));
StringBuilder sb = new StringBuilder();
Deque<Integer> d = new LinkedList<>();
int n = Integer.parseInt(br.readLine());
for(int i=0;i<n;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String order = st.nextToken();
int result = -2;
switch(order) {
case "1" :
d.offerFirst(Integer.parseInt(st.nextToken()));
break;
case "2" :
d.offerLast(Integer.parseInt(st.nextToken()));
break;
case "3" :
if(d.isEmpty()) result = -1;
else result = d.pollFirst();
break;
case "4" :
if(d.isEmpty()) result = -1;
else result = d.pollLast();
break;
case "5" :
result = d.size(); break;
case "6" :
if(d.isEmpty()) result = 1;
else result = 0;
break;
case "7" :
if(d.isEmpty()) result = -1;
else result = d.peekFirst();
break;
case "8" :
if(d.isEmpty()) result = -1;
else result = d.peekLast();
break;
}
if(result != -2) sb.append(result).append("\n");
}
bw.write(sb + "");
br.close();
bw.close();
}
}