-
백준 5430 ACAlgorithm/문자열 2021. 11. 22. 16:01728x90
https://www.acmicpc.net/problem/5430
- 문자열 파싱 + 자료구조 deque 사용 문제이다.(vector를 사용해도 되긴 하다)
- 1차로 입력이 좀 까다롭고, 2차로 R연산 시 배열을 뒤집지 않고 해결할 방법을 찾아야 한다.(만약 배열을 직접 뒤집을 시 시간초과가 나게 된다.)
- 필자는 배열 형태를 입력받아서, erase 메서드로 맨 앞, 맨 뒤 대괄호를 없애고 추가로 쉼표를 기준으로 파싱을 한 뒤 정수로 변환하여 덱에 push를 했다.
- reverse 상태 여부를 boolean변수로 체크했고, D 연산을 실행하는 경우에 만약 현재 reverse가 된 상태라면 덱의 뒤에서, 아니라면 덱의 앞에서 수를 하나씩 제거했다. 만약 덱이 빈 상태에서 D연산이 들어왔다면, error 변수에 true를 주고 for문을 탈출한 뒤 error를 출력하였다.
- 출력 또한 reverse여부를 기준으로 해서 앞에서, 혹은 뒤에서부터 하나씩 빼면서 출력을 했다.
- 특정 문자를 기준으로 파싱을 할 때는 sstream 헤더와 getline 메서드를 이용하자!
#include <iostream> #include <vector> #include <string> #include <sstream> #include <deque> using namespace std; int main() { int t; cin >> t; while (t--) { string s, arr, temp_string; deque<int> dq; cin >> s; int v_length; cin >> v_length; cin >> arr; arr.erase(arr.begin()); arr.erase(arr.end() - 1); istringstream ss(arr); while (getline(ss, temp_string, ',')) { dq.push_back(stoi(temp_string)); } bool error = false; bool reversed = false; for (int i = 0; i < s.length(); i++) { if (s[i] == 'R') { reversed = !reversed; } else { if (dq.size() == 0) { error = true; break; } if (reversed) dq.pop_back(); else dq.pop_front(); } } if (error) cout << "error" << '\n'; else { cout << '['; while (!dq.empty()) { if (reversed) { int c = dq.back(); dq.pop_back(); cout << c; } else { int c = dq.front(); dq.pop_front(); cout << c; } if (dq.size() != 0) cout << ','; } cout << ']' << '\n'; } } return 0; }
'Algorithm > 문자열' 카테고리의 다른 글
[프로그래머스] 신규 아이디 추천 (0) 2021.11.29 [프로그래머스] 문자열 압축 (0) 2021.09.20 [Codility - Iteration] BinaryGap (0) 2021.09.16