Patrick's Devlog

[BOJ/C++] AC(5430번) 본문

Algorithm/Algorithms Practice

[BOJ/C++] AC(5430번)

Patrick_ 2022. 9. 17. 16:41

1. 개요

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

 

5430번: AC

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

www.acmicpc.net

1-1. 설명

AC라는 언어는 정수 배열에 연산하기 위해 만든 언어이며, 이 언어에는 R(뒤집기)과 D(버리기)가 존재한다. 함수들을 조합해서 한번에 사용할 수 있다. 배열의 초기값과 수행할 함수가 주어졌을 때 최종 결과를 구하는 프로그램을 작성한다.

1-2. 제한 사항

 - 첫 줄에 테스트 케이스의 개수가 주어지며, 최대 100

 - 각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어지며, p는 1 이상 100,00 이하

 - 다음 줄에는 배열에 들어있는 수의 개수 n이 주어지며, n은 0 이상 100,000 이하

 - 다음 줄에는 [x_1,x_2,...,x_n]과 같은 형태 배열 주어지며 x_i는 1 이상 100 이하


2. 구현

2-1. 풀이

 list에 배열을 저장하여 풀이를 진행하였다. 주의할 점은 R 키워드가 나올때 진짜로 Reverse를 시키면 안된다는 점이다. 우리에게 주어진 시간은 1초이므로, 본인은 bool 변수를 통해 reverse일 때 true, 아닐 때 false를 이용하여 진행하였다. iterator에 대해 아직 미숙하여 조금 시간이 걸렸다. 이번 구현을 통해 제대로 알게 되었다. 

2-2. 코드

#include <iostream>
#include <list>
#include <algorithm>
#include <sstream>
using namespace std;

list<int> split(string str, char delimiter) { // 구분자를 기준으로 split 후 저장
    istringstream iss(str);
    string buffer;

    list<int> result;
    while (getline(iss, buffer, delimiter)) {
        result.push_back(stoi(buffer));
    }
    return result;
}

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

    int T, n;
    string p, arr;
    bool rev = false;
    bool err = false;

    cin >> T;
    
    for (int tc = 0; tc < T; tc++) {
        list<int> lists;
        rev = false; // 역순인지 판별하는 변수
        err = false; // 에러 로그를 띄우는지 판별하는 함수
        cin >> p;
        cin >> n;
        cin >> arr;

        if (n != 0) {
            lists = split(arr.substr(1, arr.size() - 2), ','); // 배열 저장
        }

        for (char f : p) {
            if (f == 'D' && n == 0) { // 배열이 비었고, D일 때
                cout << "error" << "\n";
                err = true;
                break;
            }
            else if (f == 'D' && n != 0) { // 배열이 비지 않았고, D일 때
                if (!rev) lists.pop_front(); // 맨 앞부분 제거
                else lists.pop_back(); // 맨 뒷부분 제거 (reverse 이므로)
                n -= 1;
            }
            else if (f == 'R' && n != 0) { // 배열이 비지 않았고, R일 때
                if (!rev) rev = true;
                else rev = false;
            }
        }

        if (err) continue; // error 일 때

        cout << "[";
        int index = 0;
        if (rev) { // 역순 출력
            list<int>::reverse_iterator rit(lists.rbegin());
            for (; rit != lists.rend(); rit++) {
                if (index == n - 1) cout << *rit;
                else cout << *rit << ",";
                index += 1;
            }
        }
        else {
            for (auto it = lists.begin(); it != lists.end(); it++) {
                if (index == n - 1) cout << *it;
                else cout << *it << ",";
                index += 1;
            }
        }
        
        cout << "]\n";
       
    }
    
    return 0;
}