본문 바로가기
Algorithm(C++)

[BOJ - 5430] AC(C++)

by alswns8081 2025. 2. 10.

  문제

 

  접근방법

 

 입력 받는 형태가 좀 괘씸하지만 숫자를 추출해야 하므로, substr 함수를 통해 대괄호를 제거

x = x.substr(1, x.size() - 2);

 

다음은 쉼표를 기준으로 숫자를 추출

stringstream ss(x);
string temp;

while (getline(ss, temp, ',')) {
    if (!temp.empty()) numbers.push_back(stoi(temp));
}

 

이 외에는 bool 자료형 변수를 사용해서 R의 상태를 판별(정방향 or 반대방향)

 

  기존 코드

#include <deque>
#include <iostream>
#include <sstream>

using namespace std;

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

    while (T--) {
        // 수행할 함수 p
        string p; cin >> p;

        // 배열에 들어있는 수의 개수 n
        int n; cin >> n;
        cin.ignore();
        
        // 배열에 들어있는 정수
        string x; cin >> x;

        int D_num = 0;
        for (int i = 0; i < p.length(); i++) if (p[i] == 'D') D_num++;

        if (D_num > n) {
            cout << "error\n";
            continue;
        }

        deque<int> numbers;

        x = x.substr(1, x.size() - 2);

        stringstream ss(x);
        string temp;

        while (getline(ss, temp, ',')) {
            if (!temp.empty()) numbers.push_back(stoi(temp));
        }

        bool reverse = false;

        for (int i = 0; i < p.size(); i++) {
            if (p[i] == 'R') {
                reverse = !reverse;
                continue;
            }

            if (reverse) {
                numbers.pop_back();
            } else {
                numbers.pop_front();
            }
        }
        cout << '[';

        if (reverse) {
            for (int i = numbers.size() - 1; i >= 0; i--) {
                cout << numbers[i];
                if (i != 0) cout << ',';
            }
        } else {
            for (int i = 0; i < numbers.size(); i++) {
                cout << numbers[i];
                if (i != numbers.size() - 1) cout << ',';
            }
        }
        cout << "]\n";

    }

    return 0;
}

 

  개선된 코드

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

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

    int T;
    cin >> T;

    while (T--) {
        // 수행할 함수 p
        string p;
        cin >> p;

        // 배열에 들어있는 수의 개수 n
        int n;
        cin >> n;
        cin.ignore();

        // 배열 입력받기
        string x;
        cin >> x;

        if (count(p.begin(), p.end(), 'D') > n) {  // D 개수가 n보다 많으면 error
            cout << "error\n";
            continue;
        }

        deque<int> numbers;
        x = x.substr(1, x.size() - 2);  // 대괄호 제거
        stringstream ss(x);
        string temp;

        while (getline(ss, temp, ',')) {
            if (!temp.empty()) numbers.push_back(stoi(temp));
        }

        bool reverse = false;
        int front_idx = 0, back_idx = numbers.size();

        for (char cmd : p) {
            if (cmd == 'R') {
                reverse = !reverse;  // 뒤집기 연산
            } else {  // 'D' 연산
                if (reverse) {
                    back_idx--;  // 뒤에서 제거
                } else {
                    front_idx++;  // 앞에서 제거
                }
            }
        }

        // 최종 출력
        cout << "[";
        if (front_idx < back_idx) {
            if (reverse) {
                for (int i = back_idx - 1; i >= front_idx; i--) {
                    cout << numbers[i];
                    if (i > front_idx) cout << ",";
                }
            } else {
                for (int i = front_idx; i < back_idx; i++) {
                    cout << numbers[i];
                    if (i < back_idx - 1) cout << ",";
                }
            }
        }
        cout << "]\n";
    }

    return 0;
}

 

 실제로 pop_front() 또는 pop_back()의 함수를 호출하는 것이 아닌 idx를 조정(O(1)로 처리 가능)

 

  링크

5430번: AC

'Algorithm(C++)' 카테고리의 다른 글

[BOJ - 11478] 서로 다른 부분 문자열의 개수(C++)  (0) 2025.02.08
[BOJ - 5397] 키로거(C++)  (0) 2025.02.08