#문제

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

 

5430번: AC

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

www.acmicpc.net

 

#작성 코드

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
#include <iostream>
#include <string>
#include <deque>
using namespace std;
 
deque<int> arr;
 
int main(){
    /* 테스트케이스의 개수 t (t<=100) */
    int t; cin>>t;
    for(int tc=1; tc<=t; tc++){
        bool error = false;                    // 에러 발생 여부 
        /* 수행할 함수 p가 주어짐. (1<=p의 길이<=100000)
        // R: 역순으로 변환 , D: 첫 번째 숫자를 버린다. */
        string func; cin>>func;
        /* 배열에 들어 있는 수의 개수 n이 주어짐 (0<=n<=100000) */
        int n; cin>>n;
        /* 배열의 원소 입력 ex) [1,2,3] */
        arr.erase(arr.begin(), arr.end());
        string arrinput; cin>>arrinput;
        // deque<int> arr에 숫자만 저장.
        int num=0;
        if( n!=0 ){
            for(int i=1; i<arrinput.length(); i++){
                if'0'<=arrinput[i]&&arrinput[i]<='9'){
                    num = num*10 + arrinput[i]-'0';
                }
                else{
                    arr.push_back(num);
                    num=0;
                }
            }
        }
        
        /* 함수를 수행 */
        bool reverse = false;    // 역순으로 처리할지? true/false 
        // 함수를 차례대로 하나씩 수행한다. 
        for(int i=0; i<func.length(); i++){
            // reverse 반전. 
            if( func[i]=='R' ){
                if(reverse==false) reverse=true;
                else reverse=false;
            }
            else if( func[i]=='D' ){
                if( arr.empty() ){ // 에러 발생을 표시하고 함수 실행 종료
                    error=true;
                    break;
               }
                if!reverse ){
                    // 앞에서 하나 제거 
                    arr.pop_front();
                }
                else{
                    // 뒤에서 하나 제거
                    arr.pop_back();
                }
            }
        }
        
        /* 함수 수행 결과를 출력한다. */
        // 에러가 발생한 경우에는 error를 출력한다. 
        // 에러발생 : 모든 연산 후에 []내에 아무것도 없을 때 == deque가 비게 되면
        if( error ){
            cout<<"error\n";
            continue;
        }
        
        if!reverse ){
            // 순서대로 출력한다.
            cout<<'[';
            for(int i=0; i<arr.size(); i++){
                cout<<arr[i];
                if( i!=arr.size()-1 ){
                    cout<<',';
                }
            }
            cout<<']'<<'\n';
        }
        else{
            // 역순으로 출력한다. 
            cout<<'[';
            for(int i=arr.size()-1; i>=0; i--){
                cout<<arr[i];
                if( i!=0 ){
                    cout<<',';
                }
            }
            cout<<']'<<'\n';
        }
    } 
    return 0
}
cs

##

49, 53번째 줄에서 pop연산 후에 deque가 비면 break로 함수 실행부를 빠져나가고 에러 출력으로 넘어가도록 프로그램을 짰었는데,

그런 경우는 아무 것도 없는 deque에서 pop연산을 시도한 것이 아니기 때문에 에러를 출력하면 안된다.

에러는 아무 것도 없는 deque에서 pop연산을 시도했을 때 발생한다.

함수를 하나 수행할 때마다 deque가 비었을 때 D(pop연산)를 수행하려고 하는지 체크하고, 에러가 발생하면 에러 발생을 체크하고 그 이후의 함수는 수행하지 않는다.(수행해도 아무런 효과가 없기 때문)

'BOJ' 카테고리의 다른 글

BOJ 11724번 :: 연결 요소의 개수  (0) 2020.02.12
BOJ 9466번 :: 텀 프로젝트  (0) 2020.02.12
BOJ 3078번 :: 좋은 친구  (0) 2020.02.10
BOJ 1182번 :: 부분수열의 합  (0) 2020.02.06
BOJ 2503번 :: 숫자 야구  (0) 2020.02.06

+ Recent posts