서의 공간
[백준] 5430_AC 본문
[문제]: 5430번: AC (acmicpc.net)
이 문제의 핵심은 D 앞에 있는 R의 개수가 짝수인지 홀수인지 아는 것이다.
D 앞에 R이 짝수개이면 짝수개의 R에 대해 뒤집는 연산은 의미가 없다. 따라서 D 연산을 할 때 앞에 원소를 삭제하면 된다.
만약 R이 홀수개라면 뒤집는 연산을 딱 한번만 한 것과 같으므로 한 번만 뒤집는다, 그러나 실제로는 배열을 뒤집지 않고 마지막 원소를 삭제하는 방법으로 원소를 삭제하는 위치만 바꾸어서 구현했다.
또한 실제로는 D 앞에 R이 짝수개인지 홀수개인지 카운트 하지 않고 짝수개이면 popWhere = false로, 홀수개이면 popWhere = true로 두어 D 연산이 삭제할 위치를 결정했다.
마지막에는 R의 총 개수가 짝수개인지 홀수개인지 확인해서 최종 배열을 뒤집지 말지 결정한다.
해당 문제는 다른 것보다 입력과 출력부분이 귀찮다.
#include <iostream>
#include <string>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T;
cin >> T;
while (T--) {
string f, str;
int n;
cin >> f >> n >> str;
string num;
deque<int> deq(n);
int index = 0;
for (int i = 1; i < str.size(); ++i) {
if (isdigit(str[i]))
num += str[i];
else if (str[i] == ',' || str[i] == ']') {
if (num != "") {
deq[index] = stoi(num);
++index;
num.clear();
}
}
}
bool popWhere = false; // false일 경우 front, true일 경우 back
bool e = false;
for (int i = 0; i < f.size(); ++i) {
if (f[i] == 'R')
popWhere = !popWhere;
else if(f[i] == 'D') {
if (deq.empty()) {
cout << "error\n";
e = true;
break;
}
if (popWhere)// popWhere이 true이면 홀수개임.
deq.pop_back();
else // popWhere이 false이면 R은 짝수개임.
deq.pop_front();
}
}
if(e == false) {
if (popWhere)
reverse(begin(deq), end(deq));
if (deq.empty())
cout << "[]\n";
else {
cout << '[';
for (int i = 0; i < deq.size() - 1; ++i)
cout << deq[i] << ',';
cout << deq[deq.size() - 1] << "]\n";
}
}
}
return 0;
}
'Algorithm > 백준' 카테고리의 다른 글
[백준] 2447_별 찍기 - 10 (0) | 2021.02.06 |
---|---|
[백준] 9020_골드바흐의 추측 (0) | 2021.02.03 |
[백준] 2217_로프 (0) | 2021.01.11 |
[백준] 1260_DFS와 BFS (0) | 2021.01.06 |
[백준] 11399_ATM (0) | 2021.01.05 |
Comments