5430. AC
백준 5430번 풀이
이 글은 Obsidian에서 마이그레이션되었으며, 그 과정에서 AI의 도움을 받았습니다. 오류나 누락된 내용이 있다면 댓글로 알려주세요!
문제
풀이
아이디어
이 문제에서 중요한 부분은 순서를 이리저리 바꾸는 배열을 다루는 부분과, 문자열 파싱하는 부분인 것 같다.
이리저리 순서를 바꾸고, 바뀐 순서에 따라서 앞뒤로 원소를 바꿀 수 있어야 하기 때문에 원소는 deque를 이용하여 저장했다. 그리고 front_op 변수를 이용해서 1일때는 front를 앞으로 하고, -1일때는 back을 앞으로 하도록 설정했다. 출력하는 부분 역시 front_op 변수의 값을 이용하여 front혹은 back부터 출력해줬다.
배열이 입력될 때 단순히 숫자만 입력되는 것이 아니라 ’[‘와 ’]’, ’,‘가 같이 입력되기 때문에 string 형태로 입력을 받아서 숫자부분만 잘라내는 문자열 파싱 작업이 필요하다. 입력받은 문자열을 처음부터 돌면서, 처음 숫자가 등장하는 부분부터 숫자가 아닌 부분까지의 길이를 구하여 substr을 이용하여 원하는 길이만큼 잘라낸 다음에 숫자로 변환해주는 방법으로 원소들을 deque에 넣어 주었다. (코드를 보는 게 더 설명이 잘 될 듯 하다. (make_deque 함수))
이렇게 만든 배열을 입력된 명령어대로 순서를 바꾸고 (R) 원소를 삭제하고 (D) 그 뒤에 문제에서 요구하는 형식대로 출력을 해 주면 된다. 나는 이 부분에서 자꾸 런타임 에러가 났었는데… 만약에 명령어를 모두 수행한 뒤에 deque가 비어 있다면 [] 를 출력해주면 된다. 내가 기존에 짠 출력함수에서는 원소가 적어도 1개는 있어야 출력이 정상적으로 되게 했었기 때문에… deque가 비어있을 경우를 따로 처리해서 오류를 해결해주었다.
코드
/*
2022-4-2
5430_AC
https://www.acmicpc.net/problem/5430
*/
#include <iostream>
#include <string>
#include <deque>
using namespace std;
deque<int> q;
void make_deque(int n, string x)
{
int i, j;
i = 1;
while(!q.empty())
q.pop_front();
while (q.size() < n)
{
if (x[i] >= '0' && x[i] <= '9')
{
j = i + 1;
while (x[j] >= '0' && x[j] <= '9' && j < x.length())
j++;
q.push_back(stoi(x.substr(i, j-i)));
i = j;
}
i++;
}
}
int do_ac(string p)
{
int front_op = 1; // 1: 정방향, -1: 역방향
for(int i = 0; i < p.length(); i++)
{
if (p[i] == 'R')
front_op *= -1;
else
{
if (q.empty())
{
cout << "error\n";
return (0);
}
else if (front_op == 1)
q.pop_front();
else
q.pop_back();
}
}
return (front_op);
}
void print_deque(int front_op)
{
cout << '[';
if (q.empty())
{
cout << "]\n";
return ;
}
if (front_op == 1)
{
while (q.size() > 1)
{
cout << q.front() << ',';
q.pop_front();
}
cout << q.front() << "]\n";
q.pop_front();
}
else
{
while (q.size() > 1)
{
cout << q.back() << ',';
q.pop_back();
}
cout << q.back() << "]\n";
q.pop_back();
}
}
void AC()
{
string p, x;
int n, front_op;
cin >> p;
cin >> n;
cin >> x;
make_deque(n, x);
front_op = do_ac(p);
if (front_op == 0)
return ;
print_deque(front_op);
}
int main()
{
int t;
cin >> t;
for(int i = 0; i < t; i++)
AC();
return (0);
}