https://www.acmicpc.net/problem/5430
5430번: AC
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
www.acmicpc.net
풀이
결론부터 말하자면 문자열 파싱 부분에서 막혔다.
그리고 코드가 더럽다. 골드 문제는 정말 쉽지 않구나를 느꼈다.
우선 어째서 덱인가? vector로 접근하고 R에서 reverse method를 사용하고 push까지 사용하게 된다면..
심상치 않은 주어진 범위에 시간초과가 날 것이라고 생각하였다.
문제에서 요구하는 'push'와 '역으로접근하기'는 deque 자료구조가 가장 효율적으로 수행할 수 있었다.
R과 D의 구현에 있어서는 Toggle idea가 바로 떠올랐다.
브론즈 문제에서 특히 Toggle idea를 쓰는 문제를 굉장히 인상깊게 풀어서 그런가보다.
문제의 digit parsing 부분이다.
처음에는 아래 코드에 주석단 것처럼 코드를 작성했었는데, [42]에서 42로 parsing되는 것이 아닌 4와 2로 parsing되는 문제가 존재했다. 결국 temp, 즉 임시 배열을 선언한 후 가장 중요한 콤마를 기준으로 숫자를 저장하고 덱에 push_back해줘야 했다.
+) 조건문을 기술하며 합칠 수 있는 지 고민하자. / 출력 형식 맞춰주는 것에서 피지컬을 기를 수 있었음.
실제 코딩테스트에서는 이와 같이 여러 개념이 복합되어 나오겠지요?
조급해하지말고 나만의 속도로 꾸준히 하길
내 코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int T, n; string p;
cin >> T;
while (T--) {
cin >> p;
cin >> n;
string s, temp;
cin >> s;
deque<int> dq;
int toggle = 0;
for (auto c : s) {
//이렇게하면 오류 if (c != '[' && c != ']' && c != ',') dq.push_back(c - '0');
if (isdigit(c)) {
temp += c;
}
else if (c == ',' || c == ']') {
if (!temp.empty()) {
dq.push_back(stoi(temp));
temp.clear();
}
}
}
for (auto c : p) {
if (c == 'R') toggle = !toggle;
else if (c == 'D' && dq.empty()) {
cout << "error" << '\n';
toggle = -1;
break;
}
else if (c == 'D') {
if (!toggle) dq.pop_front();
else dq.pop_back();
}
}
if (toggle != -1) {
cout << '[';
if (!dq.empty()) {
if (!toggle) {
while (dq.size() > 1) {
cout << dq.front() << ',';
dq.pop_front();
}
cout << dq.front();
}
else {
while (dq.size() > 1) {
cout << dq.back() << ',';
dq.pop_back();
}
cout << dq.back();
}
}
cout << ']' << '\n';
}
}
}