문제 해석
- 첫번째 줄로 명령어의 수(N)을 입력받는다.
- 명령어의 수(N)을 입력받았다면 두번째 줄부터 한 줄에 한개의 명령어씩 입력받는다.
- 명령의 종류는 아래와 같다.
✧ push_front X: 정수 X를 덱의 앞에 넣는다.
✧ push_back X: 정수 X를 덱의 뒤에 넣는다.
✧ pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
✧ pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
✧ size: 덱에 들어있는 정수의 개수를 출력한다.
✧ empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
✧ front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
✧ back: 덱의 가장 뒤에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
코드
import java.io.*;
import java.util.*;
public class Main {
static LinkedList<Integer> queue = new LinkedList<>();
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());
while(N --> 0){
String str = br.readLine();
if(str.contains("push")){
StringTokenizer st = new StringTokenizer(str);
if(st.nextToken().contains("front")){
push_front(Integer.parseInt(st.nextToken()));
}else if(str.contains("back")){
push_back(Integer.parseInt(st.nextToken()));
}
}else if(str.contains("pop")){
if(str.contains("front")){
sb.append(pop_front()).append("\n");
}else if(str.contains("back")){
sb.append(pop_back()).append("\n");
}
}else if(str.contains("size")){
sb.append(size()).append("\n");
}else if(str.contains("empty")){
sb.append(empty()).append("\n");
}else if(str.contains("front")){
sb.append(front()).append("\n");
}else if(str.contains("back")){
sb.append(back()).append("\n");
}
}
br.close();
System.out.println(sb);
}
static void push_front(int X){
queue.addFirst(X);
}
static void push_back(int X){
queue.addLast(X);
}
static int pop_front(){
if(empty() == 1){
return -1;
}
return queue.removeFirst();
}
static int pop_back(){
if(empty() == 1){
return -1;
}
return queue.removeLast();
}
static int size(){
return queue.size();
}
static int empty(){
return (queue.size() <= 0) ? 1 : 0;
}
static int front(){
if(empty() == 1){
return -1;
}
return queue.peekFirst();
}
static int back(){
if(empty() == 1){
return -1;
}
return queue.peekLast();
}
}
참고한 코드
import java.io.*;
import java.util.*;
public class Main {
static int front = 0;
static int back = 0;
static int size = 0;
static int[] queue = new int[10000];
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());
for(int i = 0; i < N; i++){
String[] order = br.readLine().split(" ");
switch (order[0]){
case "push_front" : {
push_front(Integer.parseInt(order[1]));
break;
}
case "push_back" : {
push_back(Integer.parseInt(order[1]));
break;
}
case "pop_front" : {
sb.append(pop_front()).append('\n');
break;
}
case "pop_back" : {
sb.append(pop_back()).append('\n');
break;
}
case "size" : {
sb.append(size()).append('\n');
break;
}
case "empty" : {
sb.append(empty()).append('\n');
break;
}
case "front" : {
sb.append(front()).append('\n');
break;
}
case "back" : {
sb.append(back()).append('\n');
break;
}
}
}
br.close();
System.out.println(sb);
}
static void push_front(int element){
queue[front] = element;
front = (front - 1 + 10000) % 10000;
size++;
}
static void push_back(int element){
back = (back + 1) % 10000;
size++;
queue[back] = element;
}
static int pop_front(){
if (size == 0) {
return -1;
}
int ret = front();
front = (front + 1) % 10000;
size--;
return ret;
}
static int pop_back(){
if (size == 0) {
return -1;
}
int result = back();
back = (back - 1 + 10000) % 10000;
size--;
return result;
}
static int size(){
return size;
}
static int empty(){
if(size == 0){
return 1;
}
return 0;
}
static int front(){
if(size == 0){
return -1;
}
return queue[(front+1) % 10000];
}
static int back(){
if(size == 0){
return -1;
}
return queue[back];
}
}
결과
1
2
느낀 점
- 기본 배열 코드는 이해하는 데만 시간이 꽤 걸렸다.