-
5430) AC c++백준코딩일기 2020. 11. 5. 11:59
문제 ) www.acmicpc.net/problem/5430
풀이 )
int T = 테스트 케이스 수
string cmd = 수행할 함수
int n = 배열에 들어있는 수의 개수
string arr = 입력받는 배열
int tmp = 입력받은 배열의 원소 하나를 임시 저장
bool isReverse = cmd 로 입력받은 문자중 'R'이 있다면 뒤집는지 여부를 확인하기 위함
bool isDelete = cmd 로 입력받은 문자중 'D'가 있다면 맨 앞 문자를 지울지 확인하기 위함1. 입력받은 배열에서 맨 앞 대괄호 지우기
ex). [1,2,3,4] 이런식으로 입력이 되어서 맨 앞에 '[' 이 부분 지우기
arr = arr.substr(1, arr.size() - 1);
2. 숫자라면 덱에 push_back 을 이용해서 순차적으로 덱에 넣기
콤마(,) 또는 오른쪽 대괄호 ']' 를 만나고 tmp 가 비어있다면 덱에 넣고,
아니라면 tmp 임시 저장 변수에 arr[i] 를 이어 붙인다.if( (arr[i] == ',' || arr[i] == ']') && tmp != "" ){ dq.push_back(atoi(tmp.c_str())); tmp = ""; } else tmp += arr[i];
3. cmd 로 함수를 입력받아서 R과 D의 함수 처리하기
'R'을 만나면 isReverse 의 boolean 값을 반대로 바꾸어준다.
--> 만약 입력받은 함수가 RR 이라면 원래대로 돌려야하기 때문에 이 연산을 줄이기 위함R 이 아닌경우는 D 밖에 없으므로, else 로 처리했다.
덱이 비어있다면, 더이상 지울 것이 없으므로 isDelete 값을 true 로 바꾸고 멈춤.
만약 덱이 비어있지 않다면,
isReverse 의 값에 따라서 앞에서부터 덱의 원소를 빼내거나 뒤에서부터 빼낸다.if(cmd[i] == 'R') isReverse = !isReverse; else { if(dq.empty()) { isDelete = true; break; } if(isReverse) dq.pop_back(); else dq.pop_front(); }
코드 )
#include <iostream> #include <deque> using namespace std; int T, n; string cmd, arr, tmp; deque<int> dq; bool isReverse=false, isDelete=false; int main(void) { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> T; while(T--) { dq.clear(); cin >> cmd >> n >> arr; // 앞 대괄호 [ 제외 arr = arr.substr(1, arr.size() - 1); for(int i=0; i<arr.size(); i++) { if( (arr[i] == ',' || arr[i] == ']') && tmp != "" ){ dq.push_back(atoi(tmp.c_str())); tmp = ""; } else tmp += arr[i]; } for(int i=0; i<cmd.size(); i++) { if(cmd[i] == 'R') isReverse = !isReverse; else { if(dq.empty()) { isDelete = true; break; } if(isReverse) dq.pop_back(); else dq.pop_front(); } } if(isDelete) { cout << "error\n"; } else if(dq.empty()) cout << "[]\n"; else if(isReverse) { cout << "["; while(dq.size() > 1) { cout << dq.back() << ","; dq.pop_back(); } cout << dq.back() << "]\n"; } else { cout << "["; while(dq.size() > 1) { cout << dq.front() << ","; dq.pop_front(); } cout << dq.front() << "]\n"; } } }
'백준코딩일기' 카테고리의 다른 글
5397) 키로거 c++ (0) 2020.11.05 1406) 에디터 c++ (0) 2020.11.05 1021) 회전하는 큐 c++ (0) 2020.11.04 10866) 덱 c++ (0) 2020.11.04 2164) 카드2 c++ (0) 2020.11.04