[백준] 5430번

김지섭·2025년 8월 21일
0

백준

목록 보기
18/26

AC(덱 뒤집기) — 시간초과→WA를 거쳐 통과까지

핵심 아이디어

  • 덱(deque<int>)에 수를 담고, R뒤집지 말고 불리언 rev만 토글.
  • Drev가 꺼져 있으면 pop_front(), 켜져 있으면 pop_back().
  • 입력 배열 문자열은 직접 파싱([…]에서 숫자 토큰만 추출).

삽질 로그

  • 시도 1) R()에서 실제로 덱을 뒤집음 → 케이스마다 O(n)이라 누적 시간초과.
  • 시도 2) 문자열 파싱 시 stoi(str[i])처럼 문자 단위 변환 사용 → 다자리 수에서 오류/오동작.
    → 구분자(, ])를 만나기 전까지 temp에 숫자 붙이고, 구분자에서 stoi(temp)로 푸시.
  • 시도 3) D 처리 순서 문제로 WA(틀렸습니다).
    D 수행 전 비었는지 먼저 확인error 출력하고 해당 케이스 종료.

최종 로직

  • 테스트케이스마다 덱 초기화 → 문자열 파싱 → 명령 순회.
  • Rrev = !rev (코드에선 토글 연산으로 구현).
  • D 시 덱이 비어 있으면 error 출력하고 그 케이스는 종료.
  • 출력 시 rev 상태에 따라 정방향/역방향으로 출력.

복잡도

  • 파싱 O(n), 명령 처리 O(m) (각 D는 O(1), R은 토글만), 출력 O(n).
    총 O(n + m).

코드 (최종)

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

int t;
string p;
int n;
string str;
deque<int> dq;
bool err;

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

    cin >> t;
    while (t--) {
        err = false;
        bool rev = false;
        cin >> p;
        cin >> n;
        cin >> str;
        string temp;
        for (int i = 0; i < str.size(); i++) {
            if (str[i] == ',' || str[i] == ']') {
                if (temp != ""){
                    dq.push_back(stoi(temp));
                    temp = "";
                }
            }
            else if (isdigit(str[i])) {
                temp += str[i];
            }
        }
        
        for (int i = 0; i < p.size(); i++) {
            
            if (p[i] == 'R') {
                rev = rev ? false : true; 
            }
            else {
                if (dq.empty()) {
                cout << "error\n";
                err = true;
                break;
                }
                if (!rev) 
                    dq.pop_front();
                else
                    dq.pop_back();
            }
        }
        if (!err) {
            cout << "[";
            if (!rev) {
                for (int i = 0; i < dq.size(); i++){
                    cout << dq[i];
                    if (i < dq.size() - 1) cout << ",";
                }
            }
            else {
                for (int i = dq.size() - 1; i >= 0; i--){
                    cout << dq[i];
                    if (i > 0) cout << ",";
                }
            }
            cout << "]\n" ;
            
        }
        dq.clear();
    }

    return 0;
}

체크리스트

  • n = 0, p = "D"error 출력되는지?
  • pR만 잔뜩 있는 경우 → 원본 그대로/역순 그대로 출력되는지?
  • 다자리 수(예: 100,200,3) 파싱 정확한지?
profile
백엔드 행 유도 미사일

0개의 댓글