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));
StringBuilder sb = new StringBuilder(); // 출력 모아쓰기
int N = Integer.parseInt(br.readLine());
Deque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < N; i++) {
String s = br.readLine();
if (s.contains("push_front")) {
inat num = Integer.parseInt(s.split(" ")[1]);
deque.addFirst(num);
} else if (s.contains("push_back")) {
int num = Integer.parseInt(s.split(" ")[1]);
deque.addLast(num);
} else if (s.equals("pop_front")) {
sb.append(deque.isEmpty() ? -1 : deque.removeFirst()).append("\n");
} else if (s.equals("pop_back")) {
sb.append(deque.isEmpty() ? -1 : deque.removeLast()).append("\n");
} else if (s.equals("size")) {
sb.append(deque.size()).append("\n");
} else if (s.equals("empty")) {
sb.append(deque.isEmpty() ? 1 : 0).append("\n");
} else if (s.equals("front")) {
sb.append(deque.isEmpty() ? -1 : deque.getFirst()).append("\n");
} else if (s.equals("back")) {
sb.append(deque.isEmpty() ? -1 : deque.getLast()).append("\n");
}
}
System.out.print(sb);
}
}
ArrayDeque 구현체를 이용해 덱 구현
removeFirst 와 pollFirst 의 차이 && getFirst 와 peekFirst 의 차이
remove/ get: 덱이 빈 경우 NoSuchElementException 발생 → if-else 로 deq.isEmpty() 인 경우의 로직 처리가 되어 있다면 상관없지만, 지금처럼 sb.append 내부에서 삼항 연산이 이루어지는 경우 반환 타입이 달라짐 -1 || StringBuilder → 백준 문제에서 오류나지는 않았음poll / peek: 덱이 빈 경우 null 반환결론 : null-safe 인 메서드 peek , poll 을 사용하자.
(추가)
앞 / 뒤에 요소 추가 offer
add / push : 예외발생offer : false 반환, 예외 발생 안함앞 / 뒤 요소 제거 후 반환 poll
remove : 예외발생poll : null 반환앞 / 뒤 요소 확인(제거 X) peek
get : 예외발생peek : null 반환