문제 출처 : https://www.acmicpc.net/problem/5430

 

5430번: AC

문제 선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다. 함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다. 함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다.

www.acmicpc.net

이 문제는 덱을 사용하는 문제이다. 

맨 처음 벡터를 사용하였다가 양방향으로 삽입, 삭제가 안되어서 양방향으로 사용할 수 있는 덱을 선택했다.

reverse 함수를 사용해서 앞 뒤를 바꿔주었는데 매번 R을 볼 때 마다 바꾸니 시간 초과가 나와서 홀수 짝수일 경우를 

선택하여 한번만 바꾸어주었다. 

문제가 까다로워서 시간이 많이 걸린 문제이다.

아래는 해당 문제를 해결한 소스이다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include<stdio.h>
#include<iostream>
#include<deque>
#include <algorithm>
#pragma warning(disable:4996)
using namespace std;
char arr[100001];
int main()
{
    //freopen("5430.inp", "r", stdin);
    //freopen("5430.out", "w", stdout);
    int T;
    scanf("%d"&T);
    int num;
    int n;
    char c;
    for (int i = 0; i < T; i++)
    {
        int cnt = 0;
        int flag = 0;
        deque <int> deq;
        scanf("%s"&arr);
        scanf("%d\n"&n);
        scanf("%c"&c); // [ 받음
        if (n != 0)
        {
            for (int j = 0; j < n; j++)
            {
                scanf("%d%c"&num, &c); // 숫자랑 , ] 받음
                deq.push_back(num);
            }
        }
        else
            scanf("%c%c"&c, &c);
        for (int j = 0; arr[j] != '\0'; j++)
        {
            if (arr[j] == 'R')
                cnt++;
            else if (arr[j] == 'D')
            {
                if (deq.empty())
                {
                    flag = 1;
                    break;
                }
                else
                {
                    if (cnt % 2 == 0)
                        deq.pop_front();
                    else
                        deq.pop_back();
                }
            }
        }
        if (cnt % 2 != 0)
            reverse(deq.begin(), deq.end());
        if (flag == 0)
        {
            int value = deq.size();
            printf("[");
            for (int j = 0; j < value; j++)
            {
                printf("%d", deq.front());
                deq.pop_front();
                if (j != value - 1)
                    printf(",");
            }
            printf("]\n");
        }
        else
            printf("error\n");
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
블로그 이미지

뀨심볼

깃허브 주소는 : https://github.com/hhyc2 입니다~

,