문제 접근

처음에는, 그냥 reverse함수를 이용해 뒤집고, 제출하니 시간 초과가 났다. 뒤집을 때 최대 105 개의 연산을 하고, p의 최대 길이는 105 이므로, 1010번의 연산을 수행하게 된다. 따라서 1초 만에 통과하지 못한다.

이 문제는 접근 방식을 바꿔야 하는 문제이다.

뒤집고, 맨 앞의 원소를 제거하는 연산을 => 뒤집지 않고, 맨앞 또는 맨뒤의 원소를 제거하는 것으로 다르게 생각해서 시간 복잡도를 줄여야 한다.

bool변수를 두어, 정방향은 false, 역방향은 true로 두고 뒤집는 연산을 대신하였다.

 

메모

이 문제는 입력을 받는 것도 까다로웠다. '['  ']'  ',' 를 걸러내고 숫자만 받아야 하는데, 받는 수가 최대 3자리임을 고려해야한다. 아래에서는 ',' ']' 일 때, 수를 push 하는 방식으로 구현했다. 받는 자리 수가 한자리 수가 아닐 수 있으므로, 숫자가 연속으로 나오면 전에 숫자에 10을 곱하는 형식으로 해결했다.

 

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

void solve() {
  int t;
  cin >> t;

  string p, in;
  int n;
  a:
  while(t -- > 0) {
    int cur = 0;
    int len = 0;
    cin >> p;
    cin >> n;
    cin >> in;
    deque<int> d;
    deque<int> temp;
    for(char c : in) { // input
      if(c == '[') {
        continue;
      }
      if(c == ']' || c == ',') {
        if(cur == 0) continue;
        d.push_back(cur);
        cur = 0;
        continue;
        }
      cur = cur * 10 + (c - '0');
      temp.push_back(0);
    }
    bool isError = false;
    bool flag = false;
    for(char c: p) {
      if(c == 'R') { // 뒤집기
        flag = !flag;
      } else if(c == 'D') {
        if(d.empty()) {
          isError = true;
          break;
        }
        if(flag) {
          d.pop_back();
        } else {
          d.pop_front();
        }
      }
    }
    if(isError) {
      cout << "error" << '\n';
    }
    else {  
      cout << '[';
      for(int i = 0; i < d.size(); i ++) {
        if(flag) {
          cout << d[d.size() - 1 - i];
        } else {
          cout << d[i];
        }
        if(i+1 != d.size()) cout << ',';
      }
      cout << ']' << '\n';
    }
  }
}

// ************************************

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  solve();
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2504] 괄호의 값 - C++  (0) 2022.04.27
[백준 10799] 쇠막대기 - C++  (0) 2022.04.27
[백준 2493] 탑 - C++  (1) 2022.04.21
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기