백준(C++)/문제풀이
[백준 5430/C++] AC
devhater
2023. 7. 18. 16:26
1. 문제
https://www.acmicpc.net/problem/5430
5430번: AC
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
www.acmicpc.net
2. 문제 풀이
#include <iostream>
#include <bits/stdc++.h>
#pragma warning (disable:4996)
using namespace std;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
while (n--) {
deque<int> dq;
int rev = 0; // 회전 flag
int sum = 0;
int error = 0; // RR일 때, []가 나와야함
string s; string arr; int x;
cin >> s; // 명령어
cin >> x; // 숫자 입력
cin >> arr; // arr 입력
for (int i = 0; i < arr.size(); i++) {
if (arr[i] >= '0' && arr[i] <= '9') {
sum = sum * 10 + (arr[i] - '0');
}
else if (arr[i] == ',' || (arr[i] == ']' && arr[i-1] != '[')) {
dq.push_back(sum);
sum = 0;
}
}
for (int i = 0; i < s.size(); i++) {
if (s[i] == 'R') {
if (rev == 0) rev = 1;
else rev = 0;
}
else {
if (dq.empty()) {
cout << "error" << '\n';
error = 1;
break;
}
else if (rev == 1)
dq.pop_back();
else
dq.pop_front();
}
}
if (!error) {
if (dq.empty())
cout << '[' << ']'; // 빈 dq일때
else if (rev == 1) {
cout << '[';
for (int i = dq.size() - 1; i > 0; i--) {
cout << dq[i] << ',';
}
cout << dq[0] << ']';
}
else {
cout << '[';
for (int i = 0; i < dq.size() - 1; i++) {
cout << dq[i] << ',';
}
cout << dq[dq.size() - 1] << ']';
}
cout << '\n';
}
}
}
3. 문제 해설 및 평가
문제 푸는 개념 보다 예외처리에 신경써줘야하는 문제인 것 같다.
명령어가 R은 반대로 돌리고 D는 삭제인데, 배열에 앞 뒤에서 무언가 삭제하고 삽입한다면 STL deque로 푸는 것이 굉장히 편하다. STL deque에 대해서는 추후에 STL 카테고리에 올릴 예정이다.
핵심 아이디어는, deque에 배열에서 입력 받은 수를 그대로 넣고 R명령어를 만나면 회전 스위치를 on/off 해준다.
회전 스위치 같은 경우는 나와 같은 경우 변수 rev를 만든 후 1은 회전/ 0은 원형 으로 설정했다.
D는 회전 스위치를 참고해서 pop 명령어를 수행해주면 된다.
입력이 상당히 까다로운데, 연속적인 문자를 받고 int로 변환해주는 입력은 기초 C에서 많이 풀어본 경험을 떠올리면 된다.
(간단히 설명하자면, 아스키 코드를 사용하면 된다. '0'~'9' 까지는 연속적으로 배치되어 있다는 것을 떠올리면 쉬울 것 같다.)
추가적으로 16%에서 틀리는 사람이 많은데(나와 같은 경우도 그랬다.), 반례 Test Case는 다음과 같다.
Input :
1
RR
0
[]
Output :
[]