https://www.acmicpc.net/problem/5430
C++
#include <iostream>
#include <deque>
#include <cctype>
using namespace std;
typedef long long ll;
void printDeque(deque<ll> d, int flag)
{
cout << "[";
if (flag == 0)
{
for (auto i = d.begin(); i != d.end(); i++) {
if (i != d.begin()) cout << ",";
cout << *i;
}
}
else
{
for (auto i = d.rbegin(); i != d.rend(); ++i) {
if (i != d.rbegin())
cout << ",";
cout << *i;
}
}
cout << "]\n";
}
deque<ll> parsing(string s)
{
deque<ll> result;
ll tmp = 0;
if (s.length() > 2)
{
for (int i = 1; i < s.length(); i++) {
if (isdigit(s[i]) != 0) tmp = (tmp * 10) + (s[i] - '0');
else {
result.push_back(tmp);
tmp = 0;
}
}
}
return result;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string order, arr;
int t,n, j, flag;
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> order >> n >> arr;
deque<ll> d = parsing(arr);
for (j = 0, flag = 0; j < order.length(); j++)
{
if (order[j] == 'R') flag = 1 - flag;
else
{
if (d.empty()){
cout << "error\n";
break;
}
else{
if (flag == 0) d.pop_front();
else d.pop_back();
}
}
}
if (j == order.length()) printDeque(d, flag);
}
return 0;
}
코드 설명
main함수
먼저 빠른 입출력을 위한 코드 세 줄을 main 함수 초반부에 사용한다. (변수명은 문제에서 나온대로 사용하지 않았고 제가 보기 편하게 설정해서 사용했습니다!) 테스트 케이스 t를 int형으로 받고 바로 반복문을 t만큼 수행한다.
반복문 내에서 수행할 함수 p를 string형 order, 수의 개수 n을 정수형 n에, 배열에 들어있는 수들을 string형 arr로 받는다. arr를 사용하기 편하도록 parsing 함수를 호출해 문자열 파싱을 하고 그 결과를 덱으로 받는다. 반복문 내에서 다시 한 번 반복문을 돌면서 함수를 수행한다. R일 경우 방향 전환을 위해 flag의 값을 변경한다. 그리고 D의 경우 먼저 덱이 비어있는지 if문으로 확인한다. 덱이 비어 있다면 바로 error를 출력하고 반복문을 탈출한다. 비어 있지 않은 경우에는 flag 값에 따라 pop_front() 혹은 pop_back()을 적절히 수행한다.
반복문에서 에러 없이 모든 함수를 잘 수행한 경우에는 printDeque함수로 문제에서 요구하는 출력 형식대로 덱을 출력한다.
parsing 함수
문자열 내에 있는 숫자만을 뽑아서 덱에 넣고 그 덱을 반환하는 함수이다. 덱을 선언하고 문자열 내에서 얻어낼 숫자를 저장할 변수 tmp를 0으로 하고 s의 길이가 2보다 클 경우(최소 한 자리수의 숫자 하나가 있는 경우)에 대해 반복문을 수행한다. s[i]가 숫자일 경우에는 tmp의 값을 업데이트한다. 그리고 s[i]가 숫자가 아닐 경우에는 어떤 숫자가 끝이 난 것이므로 tmp를 덱에 넣고 tmp을 0으로 초기화한다. 이후 완성된 덱을 반환한다.
printDeque 함수
flag를 이용해서 앞에서부터, 혹은 뒤에서부터 반복문을 이용해 값을 출력한다.
느낀 점
문제를 읽고 바로 흐름을 잡아서 한 번에 풀었던 문제다. 들어오는 수가 많으니 R이 들어올 때마다 배열을 뒤집는 건 무리가 있다고 판단해서 방향을 기록하는 변수 flag를 사용했다. 그리고 R로 인해 맨 앞의 원소, 맨 뒤의 원소를 바로 버려야 하므로 덱을 사용하면 되겠다고 생각하고 코드를 작성했다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C++] 29160 나의 FIFA 팀 가치는? (0) | 2024.02.13 |
---|---|
[백준/C++] 2485 가로수 (0) | 2024.02.09 |
[백준/C++] 26266 비즈네르 암호 해독 (0) | 2024.02.04 |
[백준/C++] 20920 영단어 암기는 괴로워 (0) | 2024.01.22 |
[백준/C & C++] 1417 국회의원 선거 (0) | 2023.06.22 |