BOJ/5430 AC

tolelom·2022년 3월 18일
0

https://noj.am/5430

이 문제도 class에 있는 문제라서 풀게 되었다.

처음에 접근했던 방식은
문제에서 요구하는 대로 시뮬레이션 하는 방식으로 풀었는데 시간초과 나버렸다.

생각해보니 굳이 그렇게 할 필요는 없을 것 같아 다시 생각한 내용은 다음과 같다.
1. 어차피 'D' 명령어는 전체 숫자 배열의 앞 뒤에서만 제거한다.
2. 'R' 명령어가 나오면 제거할 방향을 바꿔준다.
3. 그래서 제거를 진짜 해줄 필요는 없고 투포인터 느낌으로 유효한 배열의 범위를 표시해주기로 했다.
4. 결과에 따라 알맞은 결과값을 출력한다.

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int tc;

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

    cin >> tc;
    while (tc--) {
        string p; cin >> p;
        int n; cin >> n;

        string temp; cin >> temp;
        vector<int> x;
        int lastcomma = 0;
        for (int i = 0; i < temp.length(); ++i) {
            if ((temp[i] == ',' || temp[i] == ']') && i - lastcomma > 1) {
                x.push_back(stoi(temp.substr(lastcomma + 1, i - lastcomma - 1)));
                lastcomma = i;
            }
        }

        int r = 0, d = 0;
        int f = 0, b = n - 1;
        bool flag = true;
        for (int i = 0; i < p.length(); ++i) {
            if (p[i] == 'R') {
                r++;
                flag = !flag;
            }
            else if (p[i] == 'D') {
                d++;
                if (flag) f++;
                else b--;
            }
        }

        if (f > b + 1)
            cout << "error" << '\n';
        else {
            cout << '[';
            if (flag) {
                for (int i = f; i <= b; ++i) {
                    cout << x[i];
                    if (i != b)
                        cout << ',';
                }
            } else {
                for (int i = b; i >= f; --i) {
                    cout << x[i];
                    if (i != f)
                        cout << ',';
                }
            }
            cout << ']' << '\n';
        }
    }
}
profile
이것 저것 작성하는 기술 블로그

0개의 댓글

관련 채용 정보