πŸ“ μ•Œκ³ λ¦¬μ¦˜/BOJ

[C++/BOJ] 5430 : AC (자료ꡬ쑰)

xxilliant 2023. 5. 2. 20:44
728x90
λ°˜μ‘ν˜•

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

 

문제

μ„ μ˜μ΄λŠ” 주말에 ν•  일이 μ—†μ–΄μ„œ μƒˆλ‘œμš΄ μ–Έμ–΄ ACλ₯Ό λ§Œλ“€μ—ˆλ‹€. ACλŠ” μ •μˆ˜ 배열에 연산을 ν•˜κΈ° μœ„ν•΄ λ§Œλ“  언어이닀. 이 μ–Έμ–΄μ—λŠ” 두 κ°€μ§€ ν•¨μˆ˜ R(λ’€μ§‘κΈ°)κ³Ό D(버리기)κ°€ μžˆλ‹€.

ν•¨μˆ˜ R은 배열에 μžˆλŠ” 수의 μˆœμ„œλ₯Ό λ’€μ§‘λŠ” ν•¨μˆ˜μ΄κ³ , DλŠ” 첫 번째 수λ₯Ό λ²„λ¦¬λŠ” ν•¨μˆ˜μ΄λ‹€. 배열이 λΉ„μ–΄μžˆλŠ”λ° Dλ₯Ό μ‚¬μš©ν•œ κ²½μš°μ—λŠ” μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

ν•¨μˆ˜λŠ” μ‘°ν•©ν•΄μ„œ ν•œ λ²ˆμ— μ‚¬μš©ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, "AB"λŠ” Aλ₯Ό μˆ˜ν–‰ν•œ λ‹€μŒμ— λ°”λ‘œ μ΄μ–΄μ„œ Bλ₯Ό μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. 예λ₯Ό λ“€μ–΄, "RDD"λŠ” 배열을 뒀집은 λ‹€μŒ 처음 두 수λ₯Ό λ²„λ¦¬λŠ” ν•¨μˆ˜μ΄λ‹€.

λ°°μ—΄μ˜ μ΄ˆκΈ°κ°’κ³Ό μˆ˜ν–‰ν•  ν•¨μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ΅œμ’… κ²°κ³Όλ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 Tκ°€ μ£Όμ–΄μ§„λ‹€. TλŠ” μ΅œλŒ€ 100이닀.

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” μˆ˜ν–‰ν•  ν•¨μˆ˜ pκ°€ μ£Όμ–΄μ§„λ‹€. p의 κΈΈμ΄λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100,000보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

λ‹€μŒ μ€„μ—λŠ” 배열에 λ“€μ–΄μžˆλŠ” 수의 개수 n이 μ£Όμ–΄μ§„λ‹€. (0 ≤ n ≤ 100,000)

λ‹€μŒ μ€„μ—λŠ” [x1,...,xn]κ³Ό 같은 ν˜•νƒœλ‘œ 배열에 λ“€μ–΄μžˆλŠ” μ •μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. (1 ≤ xi ≤ 100)

전체 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— μ£Όμ–΄μ§€λŠ” p의 길이의 ν•©κ³Ό n의 합은 70λ§Œμ„ λ„˜μ§€ μ•ŠλŠ”λ‹€.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, μž…λ ₯으둜 μ£Όμ–΄μ§„ μ •μˆ˜ 배열에 ν•¨μˆ˜λ₯Ό μˆ˜ν–‰ν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½, μ—λŸ¬κ°€ λ°œμƒν•œ κ²½μš°μ—λŠ” errorλ₯Ό 좜λ ₯ν•œλ‹€.


 

일단 μ²˜μŒμ—” vector둜 μ‹œκ°„λ³΅μž‘λ„ κ³ λ €μ•ˆν•˜κ³  reverse 썼닀가 μ‹œκ°„μ΄ˆκ³Όλ‘œ ν˜Όλ‚¨.

 

그리고 reverse ν•¨μˆ˜κ°€ μ‹œκ°„λ³΅μž‘λ„κ°€ O(n)이라 μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚œλ‹€λŠ” κ±Έ ν™•μΈν•˜κ³ ,

'R'을 μ‚¬μš©ν•  λ•Œ κ·Έλƒ₯ bool λ³€μˆ˜κ°’λ§Œ λ³€κ²½ν•΄μ„œ 'D'μΌλ•Œ μ•žμ—μ„œ v.erase ν•˜κ±°λ‚˜ v.pop_back을 ν•΄μ£Όμ—ˆλŠ”λ° 이것도 μ‹œκ°„μ΄ˆκ³Ό.

 

κ²°κ΅­.... κ΅¬κΈ€λ§μœΌλ‘œ

λ²‘ν„°μ˜ μ•ž μ›μ†Œλ₯Ό μ§€μšΈλ•ŒλŠ” μ„ ν˜•μ‹œκ°„μ΄ λ“€κΈ° λ•Œλ¬Έμ—

μ–‘μͺ½μ—μ„œ pop을 ν•  수 μžˆλŠ” dequeλΌλŠ” 자료ꡬ쑰λ₯Ό μ¨μ•Όλ§Œ ν•œλ‹€λŠ” 것을 μ•Œμ•„λƒˆμŠ΅λ‹ˆλ‹€.

이게 μ™œ κ³¨λ“œ5 λ¬Έμ œλƒ ν–ˆλŠ”λ°.. κ³¨λ“œ λ§žλ„€.

 

λ¬Έμ œν•΄κ²°κΈ°λ²• μˆ˜μ—…μ‹œκ°„μ— 배운 κ°œλ…μΈλ°, μ“Έ 일이 μžˆμœΌλ €λ‚˜ ν•˜κ³  κ°€λ³κ²Œ λ„˜κ²Όλ˜ λ‚΄μš©μ„

μ—¬κΈ°μ„œ 써먹을쀄이야 γ… γ…‘γ…  잘 μ•Œμ•„λ†”μ•Όκ² λ‹€

 

 

 

λ‚˜μ˜ 풀이

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

string p = "";
int n;
string xstring = "";
deque<int> x;

void findxnum(string xstring){
    x.clear();
    string tmp = "";
    for (int i = 0; i < xstring.length(); ++i){
        if (xstring[i] == '[') continue;
        if(xstring[i]==',' || xstring[i] == ']'){
            if(tmp.length()>0){
                int a = stoi(tmp);
                x.push_back(a);
                tmp = "";
            }
            continue;
        }
        tmp += xstring[i];
    }
    return;
}

void AC(){
    bool rev = false;
    for (int i = 0; i < p.length(); ++i){
        if(n==0){
            if(p[i]=='D'){
                cout << "error\n";
                return;
            }
            if(p[i]=='R'){ // λΉ„μ—ˆμ„λ•ŒλŠ” R도 μ²˜λ¦¬ν•„μš”
                continue;
            }
        }

        if(p[i]=='D'){
            n--;
            // cout << n << " / ";
            if (rev) x.pop_back();
            else x.pop_front();
        }
        if(p[i]=='R'){
            // reverse(x.begin(), x.end()); // μ‹œκ°„μ΄ˆκ³Ό
            if(rev) rev = false;
            else rev = true;
        }
    }

    cout << "[";
    if(!rev){
        for (int i = 0; i < x.size(); ++i){
            if(i == x.size()-1){
                cout << x[i];
                break;
            }
            cout << x[i] << ",";
        }
    }
    else{
        for (int i = x.size()-1; i >= 0; --i){
            if(i == 0){
                cout << x[i];
                break;
            }
            cout << x[i] << ",";
        }
    }
    cout << "]\n";
    return;
}

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

    cin >> t;
    for (int i = 0; i < t; ++i){
        cin >> p;
        cin >> n >> xstring;
        findxnum(xstring);
        AC();
    }
    return 0;
}

 

 

 

728x90
λ°˜μ‘ν˜•