알고리즘/백준

[백준 5430] AC (C++)

겜도리도리 2021. 8. 29. 20:29
반응형

문제

https://www.acmicpc.net/problem/5430

 

5430번: AC

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

www.acmicpc.net

풀이

입력이 단순 숫자가 아니라 문자열 형태로 들어오기 때문에 그것 또한 고려해줘야 했습니다.

명령은 뒤집기 R과 맨 앞 삭제하기 D가 있는데 R일 때 실제로 배열을 뒤집어 버리면 시간 초과가 납니다.

방향을 체크하는 변수를 만들어주고, 변수를 통해 명령어를 처리해줘야 합니다.

먼저 문자열을 입력받고, 숫자만 dq에 push해줍니다.

현재 방향을 확인하여, R입력을 받으면 상태를 전환해줍니다.

D입력을 받으면 방향이 거꾸로일 때는 뒤에서 삭제, 정뱡항일 때는 앞에서 삭제해줍니다.

삭제가 불가능한 상황일 때 D입력을 받을 때에는 error를 표시하고 루프를 즉시 종료합니다.

입력이 끝나면, 배열의 상태를 출력합니다. 이때 방향이 거꾸로일 때는 역방향으로, 정방향일 때는 앞에서부터 출력해줍니다.

소스 코드

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include<iostream>
#include<deque>
#include<string>
#include<stdlib.h>
using namespace std;
 
int main()
{
    int t;
    cin >> t;
    for (int i = 0; i < t; i++)
    {
        //현재 거꾸로인지 판단
        bool reverse = false;
        //에러가 있는지 판단
        bool iserror = false;
        string com;
        cin >> com;
        int leng;
        cin >> leng;
        string s;
        cin >> s;
        deque<int> dq;
        string temp;
        for (int j = 0; j < s.size(); j++)
        {
            //숫자만 dq에 int형태로 전달
            if (s[j] == '[')
                continue;
            else if (s[j] >= '0' && s[j] <= '9')
                temp += s[j];
            else if (s[j] == ',' || s[j] == ']')
            {
                if (!temp.empty())
                {
                    dq.push_back(stoi(temp));
                    temp.clear();
                }
            }
        }
        for (int j = 0; j < com.size(); j++)
        {
            //R입력을 받으면 방향 전환
            if (com[j] == 'R')
            {
                if (reverse)
                    reverse = false;
                else
                    reverse = true;
            }
            else
            {
                //삭제불가능할 때 error
                if (dq.empty())
                {
                    cout << "error" << endl;
                    iserror = true;
                    break;
                }
                //정방향일 때는 앞, 역방향일 때는 뒤
                if (reverse)
                    dq.pop_back();
                else
                    dq.pop_front();
            }
        }
        if (iserror)
            continue;
        else
        {
            //역방향 출력
            if (reverse)
            {
                cout << "[";
                while (!dq.empty())
                {
                    cout << dq.back();
                    dq.pop_back();
                    if (!dq.empty())
                        cout << ",";
                }
                cout << "]";
            }
           //정방향 출력
            else
           {
                cout << "[";
                while (!dq.empty())
                {
                    cout << dq.front();
                    dq.pop_front();
                    if (!dq.empty())
                        cout << ",";
                }
                cout << "]";
            }
        }
        cout << '\n';
   }
    return 0;
}
cs
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 3079] 입국심사 (C++)  (0) 2021.08.30
[백준 12865] 평범한 배낭 (C++)  (0) 2021.08.29
[백준 11000] 강의실 배정 (C++)  (0) 2021.08.27
[백준 11559] Puyo Puyo (C++)  (0) 2021.08.27
[백준 16236] 아기 상어 (C++)  (0) 2021.08.26