개발일지/알고리즘

백준 5430번 : AC

김진우 개발일지 2025. 1. 28. 20:02

R은 배열의 뒤집기, D는 배열 맨 앞 요소의 삭제다. 

R와 D가 들어온 만큼 실제로 배열을 조작하는 작업은 O(N)의 시간이 걸려 시간 초과가 나온다. 실제로 뒤집는 것이 아닌 isReversed 변수를 만들고, 삭제도 실제로 삭제하는게 아니라 시작과 끝 인덱스를 저장해 맨 마지막에 한꺼번에 배열을 수정하는 것이 바람직하다. 

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;

    for (int t = 0; t < T; t++)
    {
        string func;
        cin >> func;

        int N;
        cin >> N;

        string numStr;
        cin >> numStr;

        vector<int> arr;
        if (N > 0)
        {
            numStr = numStr.substr(1, numStr.length() - 2);
            stringstream ss(numStr);
            string temp;
            while (getline(ss, temp, ','))
            {
                arr.push_back(stoi(temp));
            }
        }

        bool isReversed = false;
        int start = 0, end = N;

        bool isError = false;
        for (char ch : func)
        {
            if (ch == 'D')
            {
                if (start >= end)
                {
                    isError = true;
                    break;
                }
                if (!isReversed)
                    start++;
                else
                    end--;
            }
            else if (ch == 'R')
            {
                isReversed = !isReversed;
            }
        }

        if (isError)
        {
            cout << "error\n";
        }
        else
        {
            cout << "[";
            if (isReversed)
            {
                for (int i = end - 1; i > start; i--)
                {
                    cout << arr[i] << ",";
                }
                if (start < end)
                    cout << arr[start];
            }
            else
            {
                for (int i = start; i < end - 1; i++)
                {
                    cout << arr[i] << ",";
                }
                if (start < end)
                    cout << arr[end - 1];
            }
            cout << "]\n";
        }
    }

    return 0;
}

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

백준 1182번 : 부분수열의 합  (1) 2025.02.02
백준 6603번 : 로또  (0) 2025.02.02
백준 1966번 : 프린터 큐  (0) 2025.01.28
백준 1158번 : 요세푸스 문제  (1) 2025.01.25
백준 1874번 : 스택 수열  (0) 2025.01.25