개발 지식/알고리즘

[백준] 5430 AC

트리맨스 2021. 7. 5. 12:30
반응형

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

 

5430번: AC

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

www.acmicpc.net

문제를 읽어보고 오자.

 

명령어에 따라서 숫자를 제거하거나 방향을 뒤집는 문제이다. 함수의 길이는 최대 10만개이므로, 실제로 위치를 바꾸게 되면은 속도가 매우 느려지게 된다. 또한, 주어진 데이터를 적절히 파싱해야 한다.

 

앞뒤 모두 pop 연산을 수행할 수 있는 deque 자료형을 사용하는 것이 좋다. 덱 자료형은 삽입 연산, pop 연산 등에서 준수한 속도를 보여주기 때문이다. 명령어와 조건에 맞게 현재 상태가 역방향인지 순방향인지 판별한다.

 

또한 파싱을 할 때 예외 처리를 몇 개 해주어야 한다. 원소가 아무것도 없을 경우와 원소가 10 이상의 두 자리 숫자일때 이다. 공통점을 보면 시작 숫자 전에는 ']' 또는',' 문자가 있으며, 원소가 0일 경우에 예외 처리를 둔다. 쉽게 파싱하기 위해서 atoi 함수를 이용해서 파싱했다.

 

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
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int num;
    cin >> num;
    while (num--)
    {
        deque<int> dq;
        bool isRev = false, isErr = false;
        string command, num;
        int len;
        char temp;
 
        cin >> command;
        cin >> len;
        cin >> num;
 
        for (int i = 1; i < num.length(); i++)
        {
            if (len && (num[i - 1== '[' || num[i - 1== ','))
                dq.push_back(atoi(&num[i]));
        }
 
        for (int i = 0; i < command.length(); i++)
        {
            if (command[i] == 'R')
                isRev = !isRev;
            else if (command[i] == 'D')
            {
                if (dq.empty())
                {
                    isErr = true;
                    break;
                }
                if (isRev)
                    dq.pop_back();
                else
                    dq.pop_front();
            }
        }
 
        if (isErr)
            cout << "error\n";
        else if (dq.empty())
            cout << "[]\n";
        else if (isRev)
        {
            cout << "[";
            while (dq.size() > 1)
            {
                cout << dq.back() << ",";
                dq.pop_back();
            }
            cout << dq.back() << "]\n";
        }
        else
        {
            cout << "[";
            while (dq.size() > 1)
            {
                cout << dq.front() << ",";
                dq.pop_front();
            }
            cout << dq.front() << "]\n";
        }
    }
    return (0);
}
cs

 

 

반응형

'개발 지식 > 알고리즘' 카테고리의 다른 글

Programmers 합승 택시 요금  (0) 2022.12.31
LeetCode 790. Domino and Tromino Tiling  (0) 2022.12.24
[백준] 5397 키로거  (0) 2021.07.05
[백준] 1927 최소 힙  (0) 2021.06.30
[백준] 1406 에디터  (0) 2021.06.21