문제
접근방법
입력 받는 형태가 좀 괘씸하지만 숫자를 추출해야 하므로, substr 함수를 통해 대괄호를 제거
x = x.substr(1, x.size() - 2);
다음은 쉼표를 기준으로 숫자를 추출
stringstream ss(x);
string temp;
while (getline(ss, temp, ',')) {
if (!temp.empty()) numbers.push_back(stoi(temp));
}
이 외에는 bool 자료형 변수를 사용해서 R의 상태를 판별(정방향 or 반대방향)
기존 코드
#include <deque>
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T; cin >> T;
while (T--) {
// 수행할 함수 p
string p; cin >> p;
// 배열에 들어있는 수의 개수 n
int n; cin >> n;
cin.ignore();
// 배열에 들어있는 정수
string x; cin >> x;
int D_num = 0;
for (int i = 0; i < p.length(); i++) if (p[i] == 'D') D_num++;
if (D_num > n) {
cout << "error\n";
continue;
}
deque<int> numbers;
x = x.substr(1, x.size() - 2);
stringstream ss(x);
string temp;
while (getline(ss, temp, ',')) {
if (!temp.empty()) numbers.push_back(stoi(temp));
}
bool reverse = false;
for (int i = 0; i < p.size(); i++) {
if (p[i] == 'R') {
reverse = !reverse;
continue;
}
if (reverse) {
numbers.pop_back();
} else {
numbers.pop_front();
}
}
cout << '[';
if (reverse) {
for (int i = numbers.size() - 1; i >= 0; i--) {
cout << numbers[i];
if (i != 0) cout << ',';
}
} else {
for (int i = 0; i < numbers.size(); i++) {
cout << numbers[i];
if (i != numbers.size() - 1) cout << ',';
}
}
cout << "]\n";
}
return 0;
}
개선된 코드
#include <algorithm>
#include <deque>
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T;
cin >> T;
while (T--) {
// 수행할 함수 p
string p;
cin >> p;
// 배열에 들어있는 수의 개수 n
int n;
cin >> n;
cin.ignore();
// 배열 입력받기
string x;
cin >> x;
if (count(p.begin(), p.end(), 'D') > n) { // D 개수가 n보다 많으면 error
cout << "error\n";
continue;
}
deque<int> numbers;
x = x.substr(1, x.size() - 2); // 대괄호 제거
stringstream ss(x);
string temp;
while (getline(ss, temp, ',')) {
if (!temp.empty()) numbers.push_back(stoi(temp));
}
bool reverse = false;
int front_idx = 0, back_idx = numbers.size();
for (char cmd : p) {
if (cmd == 'R') {
reverse = !reverse; // 뒤집기 연산
} else { // 'D' 연산
if (reverse) {
back_idx--; // 뒤에서 제거
} else {
front_idx++; // 앞에서 제거
}
}
}
// 최종 출력
cout << "[";
if (front_idx < back_idx) {
if (reverse) {
for (int i = back_idx - 1; i >= front_idx; i--) {
cout << numbers[i];
if (i > front_idx) cout << ",";
}
} else {
for (int i = front_idx; i < back_idx; i++) {
cout << numbers[i];
if (i < back_idx - 1) cout << ",";
}
}
}
cout << "]\n";
}
return 0;
}
실제로 pop_front() 또는 pop_back()의 함수를 호출하는 것이 아닌 idx를 조정(O(1)로 처리 가능)
링크
'Algorithm(C++)' 카테고리의 다른 글
[BOJ - 11478] 서로 다른 부분 문자열의 개수(C++) (0) | 2025.02.08 |
---|---|
[BOJ - 5397] 키로거(C++) (0) | 2025.02.08 |