[백준 5430번] AC
Updated:
문제 화면
문제 링크 : https://www.acmicpc.net/problem/5430
문제 풀이
이 문제는 deque의 자료구조를 응용하는 문제이다. 문제에서 말하는 ‘뒤집는’ 함수를 실제로 뒤집는 방식으로 구현하는 것이 아닌 뒤집은 횟수(혹은 현재 상태)를 기록해서 정방향일 경우 pop_front(), 역방향일 경우 pop_back()를 해주는 방식으로 ‘뒤집는’ 함수를 구현하는 부분이 핵심이다. 출력 역시 정방향인지, 역방향인지에 따라 맞춰줘서 출력하면 된다. Input이 친절하게 들어오지 않기 때문에 숫자(1 ~ 100)를 파싱하는것도 구현해줘야 되는데 은근히 까다롭다. 알고리즘은 어렵지 않지만 deque 자료구조, 파싱, 구현 문제가 섞인 느낌이라 은근히 까다로운 문제인 것 같다.
제출 코드
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
vector<char> v;
deque<int> d;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int testcase, size, buf=0, error = 0;
int reverse = 1;
string cmd, arr;
cin >> testcase;
for(int i = 0 ; i < testcase ; i++) {
cin >> cmd;
for(int j = 0 ; j < cmd.size() ; j++) v.push_back(cmd[j]);
cin >> size;
cin >> arr;
for(int j = 0 ; j < arr.size() ; j++) {
if(arr[j]==',' || arr[j]==']') buf = 0;
else if('0' <= arr[j] && arr[j] <= '9') {
buf = (buf*10) + (arr[j]-48);
if(arr[j+1]==',' || arr[j+1]==']') {
d.push_back(buf);
}
}
}
for(int j = 0 ; j < cmd.size() ; j++) {
if(cmd[j]=='R') reverse *= -1;
else if(cmd[j]=='D') {
if(d.empty()) error = 1;
else if(reverse==1) d.pop_front();
else d.pop_back();
}
}
if(error) cout << "error" << "\n";
else if(reverse==1) { // 정방향 출력
cout << "[";
if(!d.empty()) {
cout << d.front();
d.pop_front();
}
while(!d.empty()) {
cout << "," << d.front();
d.pop_front();
}
cout << "]\n";
}
else if(reverse==-1){ // 역방향 출력
cout << "[";
if(!d.empty()) {
cout << d.back();
d.pop_back();
}
while(!d.empty()) {
cout << "," << d.back();
d.pop_back();
}
cout << "]\n";
}
v.clear();
d.clear();
error = 0;
reverse = 1;
}
return 0;
}
결론
Deque를 사용하는 문제이고 문제에서 대놓고 뒤집는 함수를 deque의 양방향 pop를 사용해서 구현하라고 알려준 게 아니기 때문에 사용자가 창의력(혹은 융통성)을 발휘해야 되는 부분이었던 것 같다. 구현 문제 치고 상당히 까다로운 느낌이라 파싱이나 인덱스 활용하는 부분에 있어서 초반에 실수를 많이 했는데 덕분에 꼼꼼함이 +1 된 느낌이다.
Leave a comment