[Baekjoon] Class2 33 - 덱 [10866]
덱 [10866번]
정수를 저장하는 덱(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보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.V
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
생각해볼점
덱(deque)
위키피디아 링크
덱(deque)이란 큐와 스택을 합친 자료형이다. 앞 뒤 양쪽에서 자유롭게 데이터의 삽입과 삭제를 수행할 수 있다.
기능은 단순하게 양방향 연결리스트로 구현하였다.
코드 구현
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct deque
{
int num;
struct deque *next;
struct deque *before;
} dq;
static void push_front(dq *head)
{
dq *new;
int push_temp;
scanf("%d", &push_temp);
new = (dq *)malloc(sizeof(dq));
new->num = push_temp;
new->next = head->next;
new->before = head;
head->next = new;
new->next->before = new;
}
static void push_back(dq *tail)
{
dq *new;
int push_temp;
scanf("%d", &push_temp);
new = (dq *)malloc(sizeof(dq));
new->num = push_temp;
new->next = tail;
new->before = tail->before;
new->before->next = new;
tail->before = new;
}
static void pop_front(dq *head)
{
dq *temp;
if (!head->next->next)
{
printf("-1\n");
return ;
}
temp = head->next;
printf("%d\n", temp->num);
head->next = head->next->next;
head->next->before = head;
free(temp);
}
static void pop_back(dq *tail)
{
dq *temp;
if (!tail->before->before)
{
printf("-1\n");
return ;
}
temp = tail->before;
printf("%d\n", temp->num);
tail->before = tail->before->before;
tail->before->next = tail;
free(temp);
}
static void size_dq(dq *head)
{
int count = -1;
while (head->next)
{
count++;
head = head->next;
}
printf("%d\n", count);
}
static void empty_dq(dq *head)
{
if (!head->next->next)
printf("1\n");
else
printf("0\n");
}
static void front_dq(dq *head)
{
if (!head->next->next)
printf("-1\n");
else
printf("%d\n", head->next->num);
}
static void back_dq(dq *tail)
{
if (!tail->before->before)
printf("-1\n");
else
printf("%d\n", tail->before->num);
}
int main()
{
int num, idx;
char order[20];
dq *head, *tail;
scanf("%d", &num);
head = (dq *)malloc(sizeof(dq));
tail = (dq *)malloc(sizeof(dq));
head->next = tail;
head->before = NULL;
tail->next = NULL;
tail->before = head;
idx = 0;
while (idx < num)
{
scanf("%s", order);
if (strcmp(order, "push_front") == 0)
push_front(head);
else if (strcmp(order, "push_back") == 0)
push_back(tail);
else if (strcmp(order, "pop_front") == 0)
pop_front(head);
else if (strcmp(order, "pop_back") == 0)
pop_back(tail);
else if (strcmp(order, "size") == 0)
size_dq(head);
else if (strcmp(order, "empty") == 0)
empty_dq(head);
else if (strcmp(order, "front") == 0)
front_dq(head);
else if (strcmp(order, "back") == 0)
back_dq(tail);
idx++;
}
return (0);
}