[백준 5430번] AC

Updated:


문제 화면

image image

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

문제 풀이

이 문제는 deque의 자료구조를 응용하는 문제이다. 문제에서 말하는 ‘뒤집는’ 함수를 실제로 뒤집는 방식으로 구현하는 것이 아닌 뒤집은 횟수(혹은 현재 상태)를 기록해서 정방향일 경우 pop_front(), 역방향일 경우 pop_back()를 해주는 방식으로 ‘뒤집는’ 함수를 구현하는 부분이 핵심이다. 출력 역시 정방향인지, 역방향인지에 따라 맞춰줘서 출력하면 된다. Input이 친절하게 들어오지 않기 때문에 숫자(1 ~ 100)를 파싱하는것도 구현해줘야 되는데 은근히 까다롭다. 알고리즘은 어렵지 않지만 deque 자료구조, 파싱, 구현 문제가 섞인 느낌이라 은근히 까다로운 문제인 것 같다.

제출 코드

#include <iostream>
#include <vector>
#include <deque>
using namespace std;

vector<char> v;
deque<int> d;

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int testcase, size, buf=0, error = 0;
    int reverse = 1;
    string cmd, arr;

    cin >> testcase;

    for(int i = 0 ; i < testcase ; i++) {
        cin >> cmd;
        for(int j = 0 ; j < cmd.size() ; j++) v.push_back(cmd[j]);
     
        cin >> size;

        cin >> arr;
        for(int j = 0 ; j < arr.size() ; j++) {
            if(arr[j]==',' || arr[j]==']') buf = 0;
            else if('0' <= arr[j] && arr[j] <= '9') {
                buf = (buf*10) + (arr[j]-48);
                if(arr[j+1]==',' || arr[j+1]==']') {
                    d.push_back(buf);
                }
                    
            }
        }

        for(int j = 0 ; j < cmd.size() ; j++) {
            if(cmd[j]=='R') reverse *= -1;
            else if(cmd[j]=='D') {
                if(d.empty()) error = 1;
                else if(reverse==1) d.pop_front();
                else d.pop_back();
            }
        }

        if(error) cout << "error" << "\n";
        else if(reverse==1) { // 정방향 출력
            cout << "[";
            if(!d.empty()) {
                cout << d.front();
                d.pop_front();
            }
            while(!d.empty()) {
                cout << "," << d.front();
                d.pop_front();
            }
            cout << "]\n";
        }
        else if(reverse==-1){ // 역방향 출력
            cout << "[";
            if(!d.empty()) {
                cout << d.back();
                d.pop_back();
            }
            
            while(!d.empty()) {
                cout << "," << d.back();
                d.pop_back();
            }
            cout << "]\n";
        }

        v.clear();
        d.clear();
        error = 0;
        reverse = 1;
    }

    return 0;

}

결론

Deque를 사용하는 문제이고 문제에서 대놓고 뒤집는 함수를 deque의 양방향 pop를 사용해서 구현하라고 알려준 게 아니기 때문에 사용자가 창의력(혹은 융통성)을 발휘해야 되는 부분이었던 것 같다. 구현 문제 치고 상당히 까다로운 느낌이라 파싱이나 인덱스 활용하는 부분에 있어서 초반에 실수를 많이 했는데 덕분에 꼼꼼함이 +1 된 느낌이다.

Leave a comment