R은 배열의 뒤집기, D는 배열 맨 앞 요소의 삭제다.
R와 D가 들어온 만큼 실제로 배열을 조작하는 작업은 O(N)의 시간이 걸려 시간 초과가 나온다. 실제로 뒤집는 것이 아닌 isReversed 변수를 만들고, 삭제도 실제로 삭제하는게 아니라 시작과 끝 인덱스를 저장해 맨 마지막에 한꺼번에 배열을 수정하는 것이 바람직하다.
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
for (int t = 0; t < T; t++)
{
string func;
cin >> func;
int N;
cin >> N;
string numStr;
cin >> numStr;
vector<int> arr;
if (N > 0)
{
numStr = numStr.substr(1, numStr.length() - 2);
stringstream ss(numStr);
string temp;
while (getline(ss, temp, ','))
{
arr.push_back(stoi(temp));
}
}
bool isReversed = false;
int start = 0, end = N;
bool isError = false;
for (char ch : func)
{
if (ch == 'D')
{
if (start >= end)
{
isError = true;
break;
}
if (!isReversed)
start++;
else
end--;
}
else if (ch == 'R')
{
isReversed = !isReversed;
}
}
if (isError)
{
cout << "error\n";
}
else
{
cout << "[";
if (isReversed)
{
for (int i = end - 1; i > start; i--)
{
cout << arr[i] << ",";
}
if (start < end)
cout << arr[start];
}
else
{
for (int i = start; i < end - 1; i++)
{
cout << arr[i] << ",";
}
if (start < end)
cout << arr[end - 1];
}
cout << "]\n";
}
}
return 0;
}'개발일지 > 알고리즘' 카테고리의 다른 글
| 백준 1182번 : 부분수열의 합 (1) | 2025.02.02 |
|---|---|
| 백준 6603번 : 로또 (0) | 2025.02.02 |
| 백준 1966번 : 프린터 큐 (0) | 2025.01.28 |
| 백준 1158번 : 요세푸스 문제 (1) | 2025.01.25 |
| 백준 1874번 : 스택 수열 (0) | 2025.01.25 |