Memo
로직 설명
•
배열의 시작 부분과 끝 부분을 각각 변수에 저장합니다.
•
R 작업이 들어왔을 때, start와 end값을 바꿔주기만 하면 됩니다. (역순이라는 것을 표현하기 위한 변수도 필요)
•
D 작업은 start 포인터를 증가 또는 감소시키면 됩니다. 증가되는 경우는 역순이 아닌 경우고, 감소는 역순인 경우입니다.
Code
제출 날짜
@5/13/2021
메모리
3708 KB
시간
20 ms
7등..
#include <iostream>
#include <string>
#include <algorithm>
#define endl "\n"
int T, n;
std::string p, arr;
int x[100001];
std::string ans;
int start, end, reverse;
void io_faster()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
}
void input()
{
io_faster();
std::cin >> T;
}
bool is_num(char ch)
{
if ('0' <= ch && ch <= '9')
return (1);
return (0);
}
void parsing()
{
int i = 0;
int size = arr.size();
int save = 0;
int x_ind = 0;
while (++i < size)
{
if (is_num(arr[i]))
{
save *= 10;
save += (arr[i] - '0');
}
else
{
x[x_ind++] = save;
save = 0;
}
}
}
bool operation()
{
start = 0;
end = n - 1;
reverse = 1;
for (size_t i = 0 ; i < p.size() ; i++)
{
if (p[i] == 'R')
{
std::swap(start, end);
reverse = -reverse;
}
else if (p[i] == 'D')
{
if (start * reverse > end * reverse)
{
ans = "error";
return (0);
}
start += reverse;
}
}
return (1);
}
void make_ans()
{
ans = "[";
if (reverse == 1)
for (int i = start ; i <= end ; i++)
{
ans += std::to_string(x[i]);
if (i < end)
ans += ",";
}
else
for (int i = start ; i >= end ; i--)
{
ans += std::to_string(x[i]);
if (i > end)
ans += ",";
}
ans += "]";
}
void solve()
{
std::cin >> p >> n >> arr;
parsing();
if (!operation())
return;
make_ans();
}
void print_val()
{
std::cout << ans << endl;
}
int main()
{
input();
while (T--)
{
solve();
print_val();
}
return (0);
}
C++
복사