Backjoon Online Judge 

"5430번 : AC" 문제입니다.


문제 링크 : https://www.acmicpc.net/problem/5430


문제에서 뒤집기 연산을 빠르고 쉽게 수행하기 위해 Deque를 이용하였습니다.


 - 일단 최대 100,000개의 p를 한번에 입력받기 위해 100,002 짜리 char형 배열을 선언하였습니다.

(널문자를 고려하여 100,002개 선언)


 - 이후 주어지는 배열을 저장하기 위해 400,002 크기의 char형 배열을 선언하였습니다.

((x의 최댓값이 100이므로 구분자(,) 포함)4바이트 * 100,000 + 2 (널문자 & 마지막 구분자))


 - 저장 된 배열은 strtok를 이용하여 구분하였고, 구분 된 배열은 atoi함수로 변환하여 저장하였습니다.

(strtok -> cstring, atoi -> cstdlib 라이브러리 이용)


 - 계산부분은 뒤집기의 경우 (앞에서 부터 읽도록 / 뒤에서 부터 읽도록) 상호 변환하도록 하였고

   버리기의 경우 큐의 맨 앞부분을 POP 하는 방식으로 구현하였습니다.


많은 예외처리로 코드가 다소 복잡합니다.

코드는 C++로 작성하였습니다.

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
74
75
76
77
78
79
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <cstdlib>
 
using namespace std;
 
int main() {
    int T, n; 
    char func[100002];
    char numTmp[400002];
    int lr;    //1이면 왼쪽부터, 0이면 에러, -1이면 오른쪽부터
 
    cin >> T;
    while (T--) {
        deque<int> dq;
        lr = 1;
        cin >> func >> n >> numTmp;
 
        //char* context = NULL;
        //char* num = strtok_s(numTmp, "[],", &context);
        char *num = strtok(numTmp, "[],");
        while(num != NULL) {
            dq.push_back(atoi(num));
            //num = strtok_s(NULL, "[],", &context);
            num = strtok(NULL"[],");
        }
 
        //계산부분
        int len = strlen(func);
        for (int i = 0; i < len; i++) {
            if (func[i] == 'R') {
                lr *= -1;
            }
            else if (func[i] == 'D') {
                if (!dq.size()) {
                    lr = 0;
                    break;
                }
                if (lr == 1)
                    dq.pop_front();
                else
                    dq.pop_back();
            }
            else {
                cout << "impossible error\n";
                return -1;
            }
        }
 
        //출력부분
        if (lr == 0) {
            cout << "error\n";
        }
        else if (dq.size() == 0) {
            cout << "[]\n";
        }
        else if (lr == 1) {
            cout << "[";
            while (dq.size()-1) {
                cout << dq.front();
                cout << ",";
                dq.pop_front();
            }
            cout << dq.front() << "]\n";
        }
        else {
            cout << "[";
            while (dq.size() - 1) {
                cout << dq.back();
                cout << ",";
                dq.pop_back();
            }
            cout << dq.back() << "]\n";
        }
    }
    return 0;
}



'Programming 문제풀이 > Backjoon Online Judge' 카테고리의 다른 글

2748번 : 피보나치 수 2  (0) 2018.04.01
2747번 : 피보나치 수  (0) 2018.04.01
1021번 : 회전하는 큐  (0) 2018.03.27
10866번 : 덱  (0) 2018.03.24
1158번 : 조세퍼스 문제  (0) 2018.03.23