728x90
https://www.acmicpc.net/problem/5430
문제 풀이
이 문제에서 포인트는 세 가지로 나누어 볼 수 있다.
1. string을 입력받아서 덱에 저장
2. 에러가 발생하는 조건
3. 시간제한이 단 1초
입력받은 숫자들은 string이므로 stoi 함수를 사용해서 int로 변환해주어야 한다.
주의할 점은 단순히 isdigit으로 숫자인지 아닌지 분류한다면 두 자리 이상의 수를 제대로 덱으로 가져올 수 없다.
따라서 콤마( , )와 닫는 괄호 ( ] )가 등장한다면 int로 변환해서 덱에 push 해야 한다.
에러가 발생하는 조건은 "배열이 비어있는데 D를 사용한 경우"이다.
단순히 넘어갈 수도 있지만 "덱이 비어있을 때 에러가 발생한다."라고 착각할 수 있기에 짚고 넘어가야 한다.
가능한 input의 수는 Test_Case는 100가지, 명령어 100,000가지, 배열에 들어가는 수 100,000가지로
단순하게 접근하면 무조건 시간 초과가 발생한다!
시간을 줄이기 위해서는 뒤집기(R)를 실행하지 않아야 한다.
뒤집어진 상태를 나타내는 flag를 만들어서 접근하면 시간을 엄청나게 줄일 수 있다.
느낀 점
생각했던 구현은 모두 맞았고 제대로 구현했다. 단순한 디테일들이 부족했었다. 부족했던 디테일들은 위에 적었던 것들이다. 이 정도 수준의 문제가 재밌고 유익한 정도의 수준의 문제들인 것 같다.
코드
#include <iostream>
#include <deque>
#include <string>
using namespace std;
int t, n;
string command, arr, tmp;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> t;
while (t--) {
deque<int> dq;
bool isReverse = false;
bool isError = false;
cin >> command >> n >> arr;
for (int i = 0; i < arr.size();i++) {
if (arr[i] == ',' || arr[i] == ']') {
if (!tmp.empty()) {
dq.push_back(stoi(tmp));
tmp = "";
}
}
if (isdigit(arr[i]))
tmp += arr[i];
}
for (int i = 0; i < command.size();i++) {
if (command[i] == 'R') isReverse = !isReverse;
else {
if (dq.empty()) isError = true;
else {
if (isReverse) dq.pop_back();
else dq.pop_front();
}
}
}
if (isError) cout << "error\n";
else {
int size = dq.size();
cout << "[";
if (isReverse) {
for (int i = 0; i < size;i++) {
cout << dq.back();
dq.pop_back();
if (!dq.empty()) cout << ",";
}
}
else {
for (int i = 0; i < size;i++) {
cout << dq.front();
dq.pop_front();
if (!dq.empty()) cout << ",";
}
}
cout << "]\n";
}
}
}
'문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[C++] 백준 1992번 : 쿼드트리 (0) | 2021.07.27 |
---|---|
[C++] 백준 2630번 : 색종이 만들기 (0) | 2021.07.27 |
[C++] 백준 1021번 : 회전하는 큐 (0) | 2021.07.25 |
[C++] 백준 10866번 : 덱 (0) | 2021.07.24 |
[C++] 백준 1966번 : 프린터 큐 (0) | 2021.07.24 |
댓글