
1번부터 8번까지 메뉴가 있고, 메뉴에 따라 각각 Deque에 다른 동작을 하도록 코딩하면 된다.
문제 이해
[ Stack 스택 ]
[ Queue 큐 ]
[ DeQueue 덱 ]
해당 문제는 앞덱을 이용한 문제로, 제시한 명령에만 맞게 작동시키면 된다.
입력받는 줄 수만큼 for문을 실행하고, for문 안에서 입력받은 명령을 switch-case문으로 구분하여 명령별 동작을 구현하였다.
입출력 형식

명령 중 데이터를 삽입하는 명령 외에 출력, 추출해야하는 명령은 StringBuilder를 이용하여 객체에 넣어주고 한번에 출력하도록 했다.
코드 이해
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class App {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
Deque<Integer> deck = new ArrayDeque<>();
int menu;
int x = 0;
// 입력되는 명령의 수 만큼 반복
for (int i = 0; i < n; i++) {
// st : 명령 받기 , menu : 명령 번호
st = new StringTokenizer(br.readLine());
menu = Integer.parseInt(st.nextToken());
// 명령에 따라 다른 동작 실행
switch (menu) {
case 1:
x = Integer.parseInt(st.nextToken());
deck.addFirst(x);
break;
case 2:
x = Integer.parseInt(st.nextToken());
deck.add(x);
break;
case 3:
if (deck.isEmpty()) {
sb.append(-1).append("\n");
break;
}
sb.append(deck.poll()).append("\n");
break;
case 4:
if (deck.isEmpty()) {
sb.append(-1).append("\n");
break;
}
sb.append(deck.pollLast()).append("\n");
break;
case 5:
sb.append(deck.size()).append("\n");
break;
case 6:
if (deck.isEmpty()) {
sb.append(1).append("\n");
break;
}
sb.append(0).append("\n");
break;
case 7:
if (deck.isEmpty()) {
sb.append(-1).append("\n");
break;
}
sb.append(deck.peek()).append("\n");
break;
case 8:
if (deck.isEmpty()) {
sb.append(-1).append("\n");
break;
}
sb.append(deck.peekLast()).append("\n");
}
}
System.out.println(sb);
}
}
가장 주의해야할 점은 Deque의 경우 삽입의 기본 방향은 뒤 / 추출의 기본 방향은 앞이다. (선입선출)
기본적인 삽입,추출의 방향을 알아야 First를 넣을지 Last를 넣을지 헷갈리지 않을 수 있다.
명령 1 ) .addFirst(x) : 정수 x를 Deque의 가장 앞에 넣는다.
명령 2) .add : 정수 x를 Deque의 가장 뒤에 넣는다.
명령 3) poll() : Deque에 정수가 있으면 맨 앞의 정수를 추출(출력 + Deque에서 없앰) / 정수가 없다면 -1 출력
명령 4) .pollLast() : Deque에 정수가 있으면 맨 뒤의 정수를 추출(출력 + Deque에서 없앰) / 정수가 없다면 -1 출력
명령 5) .size() : Deque에 있는 정수의 개수(Deque의 사이즈)
명령 6) .isEmpty() : 비어있다면 1, 비어있지 않다면 0 출력
명령 7) .peek() : Deque에 정수가 있다면 맨 앞 정수 출력 (단순 출력, 추출 X)
명령 8) .peekLast() : Deque에 정수가 있다면 맨 뒤 정수 출력 (단순 출력, 추출 X)
한줄평
확실히 단계별로 풀기를 하면서 스택, 큐, 덱에 대한 문제만 반복적으로 풀다보니 어떻게 풀어야할지 감이 잡히는 것 같다.
코드의 길이를 짧게 최적화하지 않더라도 일단 문제를 해결할 수 있는 것을 목표로 잡고 기본 메소드 사용법을 공부해간다면 충분히 풀 수 있을 문제라고 생각된다.