직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.
생각의 흐름
우선 각 케이스마다 별도로 bool값을 담아두는 isReverse 와 isError 변수를 만드는 것이 핵심이다.
1) isReverse 의 사용처
이 문제를 읽자마자 든 생각은, "이걸 직접 진짜 배열을 뒤집으면 시간안에 못풀겠는데?" 였다.
당연히 직접 뒤집을 필요도 없는 문제이다.
isReverse 에 true가 담겨있으면 -> 뒤집혔다 생각하고 deque의 맨 뒤에서 원소를 제거하면 되고,
isReverse 에 false가 담겨있으면 -> 정상이다 생각하고 deque의 맨 앞에서 원소를 제거하면 된다.
2) isError의 사용처
입력을 deque에 삽입한 후, 원소를 제거하면서 나가다 만약 D 연산이 사용되야 하는데 deque이 비어있다면 이때는 "Error"을 출력하고 끝나야 한다.
아니라면 정상적으로 원소를 제거한후 남아있는 deque을 출력하면 된다.
위 2개의 상황을 구분하는 것 이 isError이다.
isError 가 true 라면 "error"만 출력하고 끝나버리고
isError 가 false 라면 "[" 와 "]" 를 출력하는 코드가 추가된다.
2. 나의 코드
#include <bits/stdc++.h>
using namespace std;
#define MAX 101
int T;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> T;
for(int i = 0; i < T; i++) {
bool isReverse = false;
bool isError = false;
deque<string> dq;
string func;
cin >> func;
int len;
cin >> len;
string numArr;
cin >> numArr;
string str = "";
for(int j = 0; j < numArr.size(); j++) {
if(isdigit(numArr[j])) {
str += numArr[j];
}else{
if(!str.empty()) {
dq.push_back(str);
str = "";
}
}
}
for(auto o : func) {
if(o == 'R') {
isReverse = (isReverse == true) ? false : true;
}else{
if(dq.empty()) {
cout << "error" << '\n';
isError = true;
break;
}
if(isReverse){
dq.pop_back();
}else{
dq.pop_front();
}
}
}
if(!isError) {
cout << "[";
}
if(isReverse && !dq.empty()) {
for(auto e = dq.rbegin(); e != dq.rend(); e++){
if(e == dq.rend() - 1) {
cout << *e;
}else {
cout << *e << ",";
}
}
}
if(!isReverse && !dq.empty()) {
for(auto e = dq.begin(); e != dq.end(); e++){
if(e == dq.end() - 1) {
cout << *e;
}else {
cout << *e << ",";
}
}
}
if(!isError) {
cout << "]\n";
}
}
return 0;
}
'Algorithm > 백준' 카테고리의 다른 글
[백준][C++] 5525번: IOIOI <225> (0) | 2022.06.02 |
---|---|
[백준][C++] 11286번: 절대값 힙 <224> (0) | 2022.05.30 |
[백준][C++] 16928번: 뱀과 사다리 게임 <222> (0) | 2022.05.23 |
[백준][C++] 16946번: 벽 부수고 이동하기 4 <221> (0) | 2022.05.19 |
[백준][C++] 3055번: 탈출 <220> (0) | 2022.05.13 |
댓글