반응형

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

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

문제 풀이

 

[주의 1]

R 연산을 할 때마다 reverse 함수를 사용하면 시간 초과가 납니다.

왜냐하면

reverse 함수가 O(N)의 시간복잡도가 걸리니깐

전체 O(n * len(p))의 시간복잡도가 걸립니다.

p의 길이가 0 <= len(p) <= 100,000,

n의 범위가 0 <= n <= 100,000 이므로

만약에 p가 전부 R로 이루어져 있고, n = 100,000 이면

O(10^5 * 10^5) = O(10^10)이 되니깐 시간제한 1초 안에 해결할 수 없습니다.

[주의 2]

빈 배열에서 R연산을 해도 error가 아니다

 

 

reverse 함수를 사용하지 않고 R연산을 구현하는 방법은

deque를 사용하면 됩니다.

 

D연산을 배열의 앞과 뒤에서 할 수 있는데

처음엔 앞에서 시작해서 R연산을 할 때마다 앞, 뒤를 바꿔주면 됩니다.

 

<c++ 소스 코드> deque 덱, 자료구조

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
#include <iostream>
#include <deque>
#include <string>
#include <vector>
using namespace std;
 
//false return is error
bool solve(deque<int> &x, string& p, bool& flag) {
    flag = true//true = queue, false = stack
    for (auto& c : p) {
        if (c == 'R') flag = !flag;
        else if (c == 'D' && x.empty()) {
            return false;
        }
        else if (c == 'D' && flag) { //queue
            x.pop_front();
        }
        else if (c == 'D' && !flag) { // stack
            x.pop_back();
        }
    }
    return true;
}
void print_x(bool flag, deque<int> &x) {
    if (flag) { //queue
        cout << '[';
        while (!x.empty()) {
            cout << x.front(); x.pop_front();
            if(!x.empty())cout << ',';
        }
        cout << ']';
    }
    else { //stack
        cout << '[';
        while (!x.empty()) {
            cout << x.back(); x.pop_back();
            if (!x.empty())cout << ',';
        }
        cout << ']';
    }
    cout << '\n';
}
 
int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int test_case; cin >> test_case;
    while (test_case--) {
        string p; cin >> p;
        int n; cin >> n;
        string s; cin >> s;
        deque<int> x;
        string num;
        s.erase(s.begin());
        for (auto& c : s) {
            if (c == ',' || c == ']' && num.size()) {
                x.push_back(stoi(num));
                num.clear();
            }
            else if (c >= '0' && c <= '9') {
                num.push_back(c);
            }
        }
        bool flag = true;
        if (solve(x, p, flag)) {
            if (flag) print_x(true, x);
            else print_x(false, x);
        }
        else {
            cout << "error\n";
        }
 
    }
    return 0;
}
 
cs

 

반응형

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 7576번] 토마토  (0) 2021.11.03
[백준 4949번] 균형잡힌 세상  (0) 2021.11.01
[백준 2164번] 카드2  (0) 2021.10.27
[백준 6198번] 옥상 정원 꾸미기  (0) 2021.10.21
[백준 2493번] 탑  (2) 2021.10.15

+ Recent posts