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
반응형