kekeyo 2025. 6. 25. 01:51
728x90

๐Ÿ‘€ ๋ฌธ์ œ

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

 

 

[๋ฌธ์ œ ์š”์•ฝ]

  • R: ๋ฐฐ์—ด ๋’ค์ง‘๊ธฐ
  • D: ์ฒซ๋ฒˆ์งธ ์ˆ˜ ๋ฒ„๋ฆฌ๊ธฐ (๋น„์–ด์žˆ๋Š”๋ฐ Dํ•  ๊ฒฝ์šฐ๋Š” error ์ถœ๋ ฅ)

๐Ÿ“ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

๋’ค์ง‘์ง€ ์•Š์œผ๋ฉด ์•ž์—์„œ ๋นผ์•ผํ•˜๊ณ , ๋’ค์ง‘์€ ํ˜•ํƒœ๋ฉด ๋’ค์—์„œ ๋นผ์•ผํ•˜๋‹ˆ๊นŒ deque ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

์šฐ์„  ๋ฐฐ์—ด์˜ ๊ฐ’์ด [, , ,] ํ˜•ํƒœ์˜ String์œผ๋กœ ๋“ค์–ด์™€์„œ ์ด ๋ฐฐ์—ด์—์„œ ๊ฐ’๋งŒ ๋นผ๊ณ , ๊ทธ๊ฑฐ๋ฅผ int๋กœ ๋ฐ”๊พธ๋ฉด์„œ deque์— ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฐ์—ด ์ „์ฒ˜๋ฆฌ ํ•จ์ˆ˜ (preprocess)๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

deque<int> preprocess(int n, const string& StringArr) {
    deque<int> dq;
    string tmp;

    for (int i = 1; i < StringArr.size(); i++) {
        char c = StringArr[i];

        if (isdigit(c) == true) {
            tmp += c;
        } else if (((c == ',') || (c == ']')) && !tmp.empty()) {
            dq.push_back(stoi(tmp));
            tmp.clear();
        }
    }
    return dq;
}

 

๋ฐ›์•„์˜จ StringArr์„ ๋Œ๋ฉด์„œ ์ˆซ์ž๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋ฉด ์šฐ์„  tmp์— ์ง‘์–ด๋„ฃ๊ณ , ๊ฐ’์ด ๋Š๊ธฐ๋Š” , ๋˜๋Š” ] ์ด ๋“ค์–ด์˜ค๋ฉด ๊ทธ๋•Œ tmp์— ์žˆ๋Š” ๊ฐ’์„ int๋กœ ๋ฐ”๊ฟ”์„œ deque์— ๋„ฃ์–ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 

 

์ฒซ๋ฒˆ์งธ ์‹œ๋„ -> ์‹œ๊ฐ„ ์ดˆ๊ณผ

void sol(string p, deque<int> dq) {
    for (char c: p) {
        if (c == 'D') {                 // D: ์ฒซ๋ฒˆ์งธ ์ˆ˜ ๋ฒ„๋ฆฌ๊ธฐ (๋น„์–ด์žˆ์œผ๋ฉด ์—๋Ÿฌ ์ถœ๋ ฅํ•˜๊ณ  ๋)
            if (dq.empty() == true) {
                cout << "error\n";
                return;
            } else {
                dq.pop_front();
            }
        } else if (c == 'R') {         // R: ๋ฐฐ์—ด์— ์žˆ๋Š” ์ˆ˜ ๋’ค์ง‘๊ธฐ
            reverse(dq.begin(), dq.end());
        }
    }

    cout << "[";
    for (size_t i = 0; i < dq.size(); ++i) {
        if (i > 0) cout << ",";
        cout << dq[i];
    }
    cout << "]\n";
}

 

D๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ

  • ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
    • ๋น„์–ด์žˆ์œผ๋ฉด: error๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด์„œ ๋
    • ๋น„์–ด์žˆ์ง€ ์•Š์œผ๋ฉด: ์ฒซ๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” pop_front()๋ฅผ ํ•ด์ค€๋‹ค.

R์ด ๋“ค์–ด์™”์„ ๋•Œ

  • reverse()๋ฅผ ์ด์šฉํ•˜์—ฌ deque๋ฅผ ์ง„์งœ ๋’ค์ง‘์—ˆ๋‹ค.

=> '์‹œ๊ฐ„์ดˆ๊ณผ' ๋ฐœ์ƒ

 

 

๋‘๋ฒˆ์งธ ์‹œ๋„ -> ์„ฑ๊ณต

R ์—ฐ์‚ฐ์ด ๋งค๋ฒˆ reverse()๋ฅผ ํ†ตํ•ด์„œ ์ „์ฒด deque๋ฅผ ๋’ค์ง‘๋Š” ๊ฒƒ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

reverse()์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์œผ๋กœ R ์ด ๋ฐ˜๋ณต๋  ๊ฒฝ์šฐ์—๋Š” ์ตœ๋Œ€ O(10^5 X 10^5)๊ฐ€ ๋˜์–ด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ ๊ฒƒ์ด๋‹ค.

// ๋ฌธ์ œ ํ•ด๊ฒฐ
void sol(string p, deque<int> dq) {
    bool isReversed = false;

    for (char c: p) {
        if (c == 'D') {                 // D: ์ฒซ๋ฒˆ์งธ ์ˆ˜ ๋ฒ„๋ฆฌ๊ธฐ (๋น„์–ด์žˆ์œผ๋ฉด ์—๋Ÿฌ ์ถœ๋ ฅํ•˜๊ณ  ๋)
            if (dq.empty() == true) {
                cout << "error\n";
                return;
            } else {
                if (isReversed == false) {
                    dq.pop_front();
                } else
                    dq.pop_back();
            }
        } else if (c == 'R') {         // R: ๋ฐฐ์—ด์— ์žˆ๋Š” ์ˆ˜ ๋’ค์ง‘๊ธฐ
            isReversed = !isReversed;
        }
    }

    // ์ถœ๋ ฅํ•˜๊ธฐ 
    cout << "[";

    if (isReversed == false) {          // ์•ˆ ๋’ค์ง‘ํ˜”์„ ๊ฒฝ์šฐ
        while (dq.size() > 1) {
            cout << dq.front() << ',';
            dq.pop_front();
        }
        if (!dq.empty()) {
            cout << dq.front();
        }

    } else {                            // ๋’ค์ง‘ํ˜”์„ ๊ฒฝ์šฐ
         while (dq.size() > 1) {
            cout << dq.back() << ',';
            dq.pop_back();
         }
         if (!dq.empty()) {
            cout << dq.back();
         }
    }
    cout << "]\n";
}

 

R ๋ช…๋ น์ด ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ์‹ค์ œ๋กœ reverse()๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋’ค์ง‘ํ˜”๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๋Š” isReversed ํ”Œ๋ž˜๊ทธ๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.

๋งŒ์•ฝ ๋’ค์ง‘ํžˆ์ง€ ์•Š์€ (isReversed = false) ์ƒํƒœ์ด๋ฉด D๋ช…๋ น์ด ๋‚˜์™”์„ ๋•Œ ์•ž์—์„œ ์ œ๊ฑฐํ•˜๊ณ ,

๋’ค์ง‘ํžŒ ์ƒํƒœ(isReversed = true) ์ด๋ฉด ๋’ค์—์„œ ์ œ๊ฑฐํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


๐Ÿ˜Ž ํ•ด๊ฒฐ ์ฝ”๋“œ

#include <iostream>
#include <deque>
#include <algorithm>
#include <string>
#include <cctype>
using namespace std;

// ๋ฐฐ์—ด ์ „์ฒ˜๋ฆฌ
deque<int> preprocess(int n, const string& StringArr) {
    deque<int> dq;
    string tmp;

    for (int i = 1; i < StringArr.size(); i++) {
        char c = StringArr[i];

        if (isdigit(c) == true) {
            tmp += c;
        } else if (((c == ',') || (c == ']')) && !tmp.empty()) {
            dq.push_back(stoi(tmp));
            tmp.clear();
        }
    }
    return dq;
}

// ๋ฌธ์ œ ํ•ด๊ฒฐ
void sol(string p, deque<int> dq) {
    bool isReversed = false;

    for (char c: p) {
        if (c == 'D') {                 // D: ์ฒซ๋ฒˆ์งธ ์ˆ˜ ๋ฒ„๋ฆฌ๊ธฐ (๋น„์–ด์žˆ์œผ๋ฉด ์—๋Ÿฌ ์ถœ๋ ฅํ•˜๊ณ  ๋)
            if (dq.empty() == true) {
                cout << "error\n";
                return;
            } else {
                if (isReversed == false) {
                    dq.pop_front();
                } else
                    dq.pop_back();
            }
        } else if (c == 'R') {         // R: ๋ฐฐ์—ด์— ์žˆ๋Š” ์ˆ˜ ๋’ค์ง‘๊ธฐ
            isReversed = !isReversed;
        }
    }

    // ์ถœ๋ ฅํ•˜๊ธฐ 
    cout << "[";

    if (isReversed == false) {          // ์•ˆ ๋’ค์ง‘ํ˜”์„ ๊ฒฝ์šฐ
        while (dq.size() > 1) {
            cout << dq.front() << ',';
            dq.pop_front();
        }
        if (!dq.empty()) {
            cout << dq.front();
        }

    } else {                            // ๋’ค์ง‘ํ˜”์„ ๊ฒฝ์šฐ
         while (dq.size() > 1) {
            cout << dq.back() << ',';
            dq.pop_back();
         }
         if (!dq.empty()) {
            cout << dq.back();
         }
    }
    cout << "]\n";
}

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

    int T; cin >> T;

    for (int i=0; i < T; i++) {
        string p; cin >> p;                     // ํ•จ์ˆ˜ p
        int n; cin >> n;                        // ๋ฐฐ์—ด์— ์žˆ๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜
        string StringArr; cin >> StringArr;     // ๋ฐฐ์—ด ์ž…๋ ฅ

        deque<int> dq = preprocess(n, StringArr);
        sol(p, dq);
    }

    return 0;
}

 


โš ๏ธ ํ‹€๋ฆฌ๊ฑฐ๋‚˜ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ ์ด์œ 

reverse()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.


๐Ÿ“š ๋ฐฐ์šด ์ 

isdigit()

: ๋ฌธ์ž๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ˆซ์ž์ธ์ง€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • ํ—ค๋”: #include <cctype>
  • int isdigit(int c);
    • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜จ char ํƒ€์ž…์ด 10์ง„์ˆ˜ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜

 

์ฐธ๊ณ  ์ž๋ฃŒ

https://cplusplus.com/reference/cctype/isdigit/?kw=isdigit

728x90