BOJ 10866. 덱
(출처 : 문제의 저작권은 BOJ에 있습니다. )
<문제>
정수를 저장하는 덱(Deque)를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여덟 가지이다.
push_front X: 정수 X를 덱의 앞에 넣는다.
push_back X : 정수 X를 덱의 뒤에 넣는다.
pop_front : 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다.
만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
pop_back : 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다.
만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size : 덱에 들어있는 정수의 개수를 출력한다.
empty : 덱이 비어있으면 1을, 아니면 0을 출력한다.
front : 덱의 가장 앞에 있는 정수를 출력한다.
만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
back : 덱의 가장 뒤에 있는 정수를 출력한다.
만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
<입력>
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다.
둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다.
주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다.
문제에 나와있지 않은 명령이 주어지는 경우는 없다.
<출력>
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
테스트 케이스는 BOJ의 해당 문제를 확인 바랍니다.
package AlgorithmBase1;
import java.io.*;
import java.util.LinkedList;
public class P10866 {
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());
Deque DQ = new Deque();
for(int i=0; i<n; i++) {
String[] strArr = br.readLine().split(" ");
switch (strArr[0]) {
case "push_front":
DQ.push_front(Integer.parseInt(strArr[1]));
break;
case "push_back":
DQ.push_back(Integer.parseInt(strArr[1]));
break;
case "pop_front":
bw.write(DQ.pop_front() + "\n");
break;
case "pop_back":
bw.write(DQ.pop_back() + "\n");
break;
case "size":
bw.write(DQ.size() + "\n");
break;
case "empty":
bw.write(DQ.empty() + "\n");
break;
case "front":
bw.write(DQ.front() + "\n");
break;
case "back":
bw.write(DQ.back() + "\n");
break;
}
}
bw.flush();
bw.close();
br.close();
}
private static class Deque {
LinkedList<Integer> list;
public Deque() {
list = new LinkedList<>();
}
public void push_front(int n) {
list.addFirst(n);
}
public void push_back(int n) {
list.addLast(n);
}
public int pop_front() {
if(list.isEmpty()) return -1;
int i = list.getFirst();
list.removeFirst();
return i;
}
public int pop_back() {
if(list.isEmpty()) return -1;
int i = list.getLast();
list.removeLast();
return i;
}
public int size() {
return list.size();
}
public int empty() {
return list.isEmpty() ? 1 : 0;
}
public int front() {
if(list.isEmpty()) return -1;
return list.getFirst();
}
public int back() {
if(list.isEmpty()) return -1;
return list.getLast();
}
}
}
해당 문제는 LinkedList 자료구조를 이용하여 풀 수 있다.
연결리스트는 데이터를 추가하거나 삭제하는 연산에 유리하다. (시간 복잡도 : )
특별한 로직 없이 구현된 코드를 참고바란다.