Algorithm/BOJ

[백준 알고리즘/C++/큐, 덱] 5430 AC

pinevienna 2021. 7. 9. 00:47

 

 

AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.

함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다.

배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.

배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 문제

 

 

함수와, 배열에 들어있는 수의 개수, 배열이 주어졌을 때 결과를 구하면 된다!

 

RDD

4

[1,2,3,4]

 

이렇게 입력되면 [2,1]을 출력한다

 

문제 자체는 쉽다!! 근데 시간초과를 조심해야 한다

R이 순서를 뒤집는 함수라고 했는데, 진짜 뒤집으려 하면 끝도 없음

내가 또 그 끝도 없는걸 한 번 했었지..^^!

덱의 장점을 살려서, R을 홀수번 수행하면 역방향으로 출력하게 하면 됨

코드에선 홀짝인지 세어보진 않았고, boolean r을 만들어서 true면 역방향으로 출력하게 했다

 

 

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
#include <iostream>
#include <deque>
#include <string>
using namespace std;
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    int t, n;
    string p, x, arr;
    deque<int> q;
    bool err, r;
 
    cin >> t;
    while (t--) {
        cin >> p >> n >> arr;
        
        //입력받은 값 덱에 저장
        for (int i = 0; i < arr.size(); i++) {
            if (arr[i] == '['continue;
            if (arr[i] == ']') {
                if (x.size() == 0break;
 
                q.push_back(stoi(x));
                x.erase();
                break;
            }
            if (arr[i] == ',') {
                q.push_back(stoi(x));
                x.erase();
                continue;
            }
            x += arr[i];
        }
 
        err = false//배열이 비어있는데 r 사용
        r = false//false = 순방향, true = 역방향
 
        for (int i = 0; i < p.size(); i++) {
            if (p[i] == 'R') r = !r;
            else {
                if (q.empty()) {
                    err = true;
                    break;
                }
 
                if (r == false) q.pop_front();
                else q.pop_back();
            }
        }
 
        //출력
        if (err)
            cout << "error" << "\n";
        else {
            cout << "[";
 
            while (!q.empty()) {
                if (r == false) {
                    cout << q.front();
                    q.pop_front();
                }
                else {
                    cout << q.back();
                    q.pop_back();
                }
 
                if (q.empty()) break;
                cout << ",";
            }
            cout << "]\n";
        }
    }
}
cs

 

이건 나의 우여곡절을 포스팅했던 것.. 그러고보니 문제 푼지 6개월만에 코드 올리네ㅋㅋㅋ

 

하..심한욕.. (백준 5430 AC C++)

큐 마지막 문제 빨리 풀고 영어공부하려고 했다 문제 읽어보면 되게 쉬운데 왜 정답 비율이 20%지?? 하며 시작 R과 D라는 함수가 있는데, R은 큐를 뒤집는거고 D는 pop_front() 후~ 뒤집는거 쩜 번거롭

pinevienna.tistory.com