[PS] 백준 5430번(Gold 5) - AC

조재훈·2024년 10월 5일

문제

백준 5430번 문제 - AC

코드

#include <bits/stdc++.h>

using namespace std;

int T, n;
string p, arrStr;

void Parsing(string arr, deque<int>& dq)
{
    string numStr = "";

    for (int i = 1; i < arr.size() - 1; i++)
    {
        if (arr[i] == ',')
        {
            dq.push_back(stoi(numStr));
            numStr = "";
        }
        else
        {
            numStr += arr[i];
        }
    }

    dq.push_back(stoi(numStr));
}

int main()
{
    cin >> T;
    
    while (T--)
    {
        cin >> p;
        cin >> n;

        cin >> arrStr;

        deque<int> dq;

        if(n != 0)
            Parsing(arrStr, dq);

        int size = p.size();
        int Rcount = 0;
        bool error = false;

        for (int i = 0; i < size; i++)
        {
            if (p[i] == 'R')
            {
                Rcount++;
            }
            else
            {
                if (dq.empty())
                {
                    cout << "error\n";
                    error = true;
                    break;
                }

                if (Rcount % 2)
                {
                    dq.pop_back();
                }
                else
                {
                    dq.pop_front();
                }
            }
        }

        if (!error)
        {
            if (Rcount % 2)
            {
                reverse(dq.begin(), dq.end());
            }

            string answer = "";
            answer += "[";
            for (int i = 0; i < dq.size(); i++)
            {
                answer += to_string(dq[i]);
                answer += ",";
            }

            if(answer.size() != 1)
                answer.pop_back();

            answer += "]";
            cout << answer << '\n';
        }
    }

    return 0;
}

풀이

이거 쉬운데 왜 20%지? 하다가 아 이래서 20%였구나 했던 문제(그거 감안해도 20%는 아닌것같긴함)

무턱대고 R과 D를 만날때마다 연산을 해주면 시간 초과 날 것임

핵심 포인트를 생각해보면
1. R의 개수 -> 여기까지는 다들 생각했을 것 같다. R이 짝수이면 안뒤집어도 되니까
2. D 연산 -> 자료구조를 적절히 선택해서 D를 만났을 때 어떤 요소를 뺄 지 잘 생각하면 된다

벡터를 쓰면 pop_back() 밖에 못 쓰니까 표현에 제한이 있다. 그래서 양쪽으로 뺄 수 있는 deque를 사용했음

그리고 D를 만났을 때 지금까지 만난 R의 개수를 세어 R이 홀수이면 뒤집고 앞을 빼는거니까 그냥 안뒤집고 뒤를 빼면 된다

R이 짝수이면 그냥 앞을 빼주면 됨

이렇게 연산이 끝나면 마지막 R 처리를 해준다. R이 홀수면 최종으로 배열을 뒤집고 짝수면 냅둔다

이렇게 쉽게 끝날 줄 알았는데 귀찮은 게 있었다

파싱인데 입력이 [1,2] 처럼 들어오고 출력도 [1,2] 처럼 출력해야 한다

그래서 파싱을 생각해줘서 구현해주고 마지막으로 내가 처음에 틀린건데 빈 배열일 경우 [] << 이렇게 출력 잘해야한다

profile
나태지옥

0개의 댓글