AC(덱 뒤집기) — 시간초과→WA를 거쳐 통과까지
핵심 아이디어
- 덱(
deque<int>
)에 수를 담고, R
은 뒤집지 말고 불리언 rev
만 토글.
D
는 rev
가 꺼져 있으면 pop_front()
, 켜져 있으면 pop_back()
.
- 입력 배열 문자열은 직접 파싱(
[…]
에서 숫자 토큰만 추출).
삽질 로그
- 시도 1)
R()
에서 실제로 덱을 뒤집음 → 케이스마다 O(n)이라 누적 시간초과.
- 시도 2) 문자열 파싱 시
stoi(str[i])
처럼 문자 단위 변환 사용 → 다자리 수에서 오류/오동작.
→ 구분자(,
]
)를 만나기 전까지 temp
에 숫자 붙이고, 구분자에서 stoi(temp)
로 푸시.
- 시도 3)
D
처리 순서 문제로 WA(틀렸습니다).
→ D
수행 전 비었는지 먼저 확인 후 error
출력하고 해당 케이스 종료.
최종 로직
- 테스트케이스마다 덱 초기화 → 문자열 파싱 → 명령 순회.
R
는 rev = !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
출력되는지?
p
에 R
만 잔뜩 있는 경우 → 원본 그대로/역순 그대로 출력되는지?
- 다자리 수(예:
100,200,3
) 파싱 정확한지?