PS(Problem Solving)/백준(BOJ)
[백준][10866번][C/C++] 덱
seongmik
2020. 12. 17. 23:05
728x90
반응형
https://www.acmicpc.net/problem/10866
10866번: 덱
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
자료구조 중 덱을 구현하는 문제이다.
나는 그냥 무식하게 조건의 2배 이상 크기의 배열을 잡고 그 중간부터 head와 tail을 이용하여 deque를 구현했다.
굳이 그럴 필요 없이 C++의 stl인 deque를 사용해서 풀어도 되는 문제이다.
신경 써줄점은 명령을 제대로 받아서 구분해서 작업을 처리하는 부분이다.
나는 명령어가 몇 개 안되기 때문에 그냥 문자열의 일부분을 보고 구분하는 방법을 사용했다.
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int deque[30000], head=15000, tail=15000;
int main() {
int N;
scanf("%d",&N);
memset(deque, -1, 30000*sizeof(int));
while(N--) {
int num;
char str[100];
scanf("%s",str);
if(str[0]=='p' && str[1]=='u') {
if(str[5]=='f') { // push_front
scanf("%d",&num);
deque[--head]=num;
}
else { // push_back
scanf("%d",&num);
deque[tail++]=num;
}
}
else if(str[0]=='p' && str[1]=='o') {
if(str[4]=='f') { // pop_front
if(head==tail) {
printf("-1\n");
}
else {
printf("%d\n",deque[head++]);
}
}
else { // pop_back
if(head==tail) {
printf("-1\n");
}
else {
printf("%d\n",deque[--tail]);
}
}
}
else if(str[0]=='s') { // size
printf("%d\n",tail-head);
}
else if(str[0]=='e') { // empty
if(head==tail) {
printf("1\n");
}
else {
printf("0\n");
}
}
else if(str[0]=='f') { // front
if(head==tail) {
printf("-1\n");
}
else {
printf("%d\n",deque[head]);
}
}
else { // back
if(head==tail) {
printf("-1\n");
}
else {
printf("%d\n",deque[tail-1]);
}
}
}
return 0;
}
728x90
반응형