[BOJ/5430/C++] AC
๐ ๋ฌธ์
https://www.acmicpc.net/problem/5430
[๋ฌธ์ ์์ฝ]
- R: ๋ฐฐ์ด ๋ค์ง๊ธฐ
- D: ์ฒซ๋ฒ์งธ ์ ๋ฒ๋ฆฌ๊ธฐ (๋น์ด์๋๋ฐ Dํ ๊ฒฝ์ฐ๋ error ์ถ๋ ฅ)
๐ ์ ๊ทผ ๋ฐฉ๋ฒ
๋ค์ง์ง ์์ผ๋ฉด ์์์ ๋นผ์ผํ๊ณ , ๋ค์ง์ ํํ๋ฉด ๋ค์์ ๋นผ์ผํ๋๊น deque ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์๋ค.
์ฐ์ ๋ฐฐ์ด์ ๊ฐ์ด [, , ,] ํํ์ String์ผ๋ก ๋ค์ด์์ ์ด ๋ฐฐ์ด์์ ๊ฐ๋ง ๋นผ๊ณ , ๊ทธ๊ฑฐ๋ฅผ int๋ก ๋ฐ๊พธ๋ฉด์ deque์ ๋ฃ์ด์ฃผ๋ ๋ฐฐ์ด ์ ์ฒ๋ฆฌ ํจ์ (preprocess
)๋ฅผ ๋ง๋ค์๋ค.
deque<int> preprocess(int n, const string& StringArr) {
deque<int> dq;
string tmp;
for (int i = 1; i < StringArr.size(); i++) {
char c = StringArr[i];
if (isdigit(c) == true) {
tmp += c;
} else if (((c == ',') || (c == ']')) && !tmp.empty()) {
dq.push_back(stoi(tmp));
tmp.clear();
}
}
return dq;
}
๋ฐ์์จ StringArr
์ ๋๋ฉด์ ์ซ์๋ก ๋ณํ์ด ๊ฐ๋ฅํ๋ฉด ์ฐ์ tmp
์ ์ง์ด๋ฃ๊ณ , ๊ฐ์ด ๋๊ธฐ๋ ,
๋๋ ]
์ด ๋ค์ด์ค๋ฉด ๊ทธ๋ tmp
์ ์๋ ๊ฐ์ int๋ก ๋ฐ๊ฟ์ deque
์ ๋ฃ์ด์ฃผ๋ ํจ์์ด๋ค.
์ฒซ๋ฒ์งธ ์๋ -> ์๊ฐ ์ด๊ณผ
void sol(string p, deque<int> dq) {
for (char c: p) {
if (c == 'D') { // D: ์ฒซ๋ฒ์งธ ์ ๋ฒ๋ฆฌ๊ธฐ (๋น์ด์์ผ๋ฉด ์๋ฌ ์ถ๋ ฅํ๊ณ ๋)
if (dq.empty() == true) {
cout << "error\n";
return;
} else {
dq.pop_front();
}
} else if (c == 'R') { // R: ๋ฐฐ์ด์ ์๋ ์ ๋ค์ง๊ธฐ
reverse(dq.begin(), dq.end());
}
}
cout << "[";
for (size_t i = 0; i < dq.size(); ++i) {
if (i > 0) cout << ",";
cout << dq[i];
}
cout << "]\n";
}
D๊ฐ ๋ค์ด์์ ๋
- ๋น์ด์๋์ง ํ์ธ
- ๋น์ด์์ผ๋ฉด: error๋ฅผ ์ถ๋ ฅํ๋ฉด์ ๋
- ๋น์ด์์ง ์์ผ๋ฉด: ์ฒซ๋ฒ์งธ ์๋ฅผ ์ ๊ฑฐํ๋ pop_front()๋ฅผ ํด์ค๋ค.
R์ด ๋ค์ด์์ ๋
- reverse()๋ฅผ ์ด์ฉํ์ฌ deque๋ฅผ ์ง์ง ๋ค์ง์๋ค.
=> '์๊ฐ์ด๊ณผ'
๋ฐ์
๋๋ฒ์งธ ์๋ -> ์ฑ๊ณต
R ์ฐ์ฐ์ด ๋งค๋ฒ reverse()
๋ฅผ ํตํด์ ์ ์ฒด deque๋ฅผ ๋ค์ง๋ ๊ฒ ๋๋ฌธ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์๋ค.
reverse()
์ ์๊ฐ ๋ณต์ก๋๋ O(N)์ผ๋ก R ์ด ๋ฐ๋ณต๋ ๊ฒฝ์ฐ์๋ ์ต๋ O(10^5 X 10^5)๊ฐ ๋์ด ์๊ฐ์ด๊ณผ๊ฐ ๋ ๊ฒ์ด๋ค.
// ๋ฌธ์ ํด๊ฒฐ
void sol(string p, deque<int> dq) {
bool isReversed = false;
for (char c: p) {
if (c == 'D') { // D: ์ฒซ๋ฒ์งธ ์ ๋ฒ๋ฆฌ๊ธฐ (๋น์ด์์ผ๋ฉด ์๋ฌ ์ถ๋ ฅํ๊ณ ๋)
if (dq.empty() == true) {
cout << "error\n";
return;
} else {
if (isReversed == false) {
dq.pop_front();
} else
dq.pop_back();
}
} else if (c == 'R') { // R: ๋ฐฐ์ด์ ์๋ ์ ๋ค์ง๊ธฐ
isReversed = !isReversed;
}
}
// ์ถ๋ ฅํ๊ธฐ
cout << "[";
if (isReversed == false) { // ์ ๋ค์งํ์ ๊ฒฝ์ฐ
while (dq.size() > 1) {
cout << dq.front() << ',';
dq.pop_front();
}
if (!dq.empty()) {
cout << dq.front();
}
} else { // ๋ค์งํ์ ๊ฒฝ์ฐ
while (dq.size() > 1) {
cout << dq.back() << ',';
dq.pop_back();
}
if (!dq.empty()) {
cout << dq.back();
}
}
cout << "]\n";
}
R ๋ช
๋ น์ด ๋์ฌ ๋๋ง๋ค ์ค์ ๋ก reverse()
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ค์งํ๋์ง๋ฅผ ์ฒดํฌํ๋ isReversed
ํ๋๊ทธ๋ฅผ ์ด์ฉํ์๋ค.
๋ง์ฝ ๋ค์งํ์ง ์์ (isReversed = false
) ์ํ์ด๋ฉด D๋ช
๋ น์ด ๋์์ ๋ ์์์ ์ ๊ฑฐํ๊ณ ,
๋ค์งํ ์ํ(isReversed = true
) ์ด๋ฉด ๋ค์์ ์ ๊ฑฐํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๐ ํด๊ฒฐ ์ฝ๋
#include <iostream>
#include <deque>
#include <algorithm>
#include <string>
#include <cctype>
using namespace std;
// ๋ฐฐ์ด ์ ์ฒ๋ฆฌ
deque<int> preprocess(int n, const string& StringArr) {
deque<int> dq;
string tmp;
for (int i = 1; i < StringArr.size(); i++) {
char c = StringArr[i];
if (isdigit(c) == true) {
tmp += c;
} else if (((c == ',') || (c == ']')) && !tmp.empty()) {
dq.push_back(stoi(tmp));
tmp.clear();
}
}
return dq;
}
// ๋ฌธ์ ํด๊ฒฐ
void sol(string p, deque<int> dq) {
bool isReversed = false;
for (char c: p) {
if (c == 'D') { // D: ์ฒซ๋ฒ์งธ ์ ๋ฒ๋ฆฌ๊ธฐ (๋น์ด์์ผ๋ฉด ์๋ฌ ์ถ๋ ฅํ๊ณ ๋)
if (dq.empty() == true) {
cout << "error\n";
return;
} else {
if (isReversed == false) {
dq.pop_front();
} else
dq.pop_back();
}
} else if (c == 'R') { // R: ๋ฐฐ์ด์ ์๋ ์ ๋ค์ง๊ธฐ
isReversed = !isReversed;
}
}
// ์ถ๋ ฅํ๊ธฐ
cout << "[";
if (isReversed == false) { // ์ ๋ค์งํ์ ๊ฒฝ์ฐ
while (dq.size() > 1) {
cout << dq.front() << ',';
dq.pop_front();
}
if (!dq.empty()) {
cout << dq.front();
}
} else { // ๋ค์งํ์ ๊ฒฝ์ฐ
while (dq.size() > 1) {
cout << dq.back() << ',';
dq.pop_back();
}
if (!dq.empty()) {
cout << dq.back();
}
}
cout << "]\n";
}
int main(void) {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T; cin >> T;
for (int i=0; i < T; i++) {
string p; cin >> p; // ํจ์ p
int n; cin >> n; // ๋ฐฐ์ด์ ์๋ ์์ ๊ฐ์
string StringArr; cin >> StringArr; // ๋ฐฐ์ด ์
๋ ฅ
deque<int> dq = preprocess(n, StringArr);
sol(p, dq);
}
return 0;
}
โ ๏ธ ํ๋ฆฌ๊ฑฐ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ ์ด์
reverse()๋ฅผ ์ฌ์ฉํ์ฌ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์๋ค.
๐ ๋ฐฐ์ด ์
isdigit()
: ๋ฌธ์๋ฅผ ๋ค๋ฃฐ ๋ ์ซ์์ธ์ง๋ฅผ ํ๋จํ ์ ์๋ ํจ์์ด๋ค.
- ํค๋:
#include <cctype>
int isdigit(int c);
- ๋งค๊ฐ๋ณ์๋ก ๋ค์ด์จ char ํ์ ์ด 10์ง์ ์ซ์๋ก ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ฉด true, ์๋๋ฉด false๋ฅผ ๋ฐํ
์ฐธ๊ณ ์๋ฃ