boj5430-풀이
문제설명Permalink
단순한 구현문제
정수 배열이 주어지고, R, D연산을 할 수 있다.
R 연산 : 배열을 뒤집는다.
D 연산 : 첫 원소를 삭제한다.
모든 연산이 완료된 상태의 배열을 출력한다.
단, 배열의 원소가 존재하지 않을 때, D연산이 일어난 경우 error
를 출력한다.
풀이Permalink
단순하게 배열을 놓고 삭제, 뒤집기를 구현해도 된다.
이 풀이에서는 최대한 배열에 대해서 실제 연산을 피하기 위해서,
배열의 시작 인덱스(
뒤집어짐 상태에 따라서 원소를 삭제할때 시작 또는 끝의 인덱스를 변경해야한다.
- 뒤집어지지 않은 경우
isReversed = false
시작의 인덱스를 뒤로 당김 - 뒤집어진 경우
isReversed = true
끝의 인덱스를 앞으로 당김
빈 배열에서 D연산이 일어나면 err
플래그를 통해 error
를 출력하고 다음 케이스로 넘어가도록 한다.
구현Permalink
#include <bits/stdc++.h>
using namespace std;
int t, n, f, e;
string p, x;
bool isReversed, err;
vector<string> nums;
void split() {
size_t last = 1, cur;
nums = vector<string>();
while ((cur = x.find_first_of(",]", last)) != string::npos) {
nums.emplace_back(x.substr(last, cur - last));
last = cur + 1;
}
}
int main() {
cin >> t;
while (t--) {
cin >> p >> n >> x;
split();
f = 0;
e = n - 1;
err = false;
isReversed = false;
for (auto&& m : p) {
if (m == 'R') {
isReversed = !isReversed;
}
else {
if (f > e) {
err = true;
break;
}
if (!isReversed) {
++f;
}
else {
--e;
}
}
}
if (err) {
cout << "error" << endl;
}
else {
cout << '[';
if (f <= e) {
if (isReversed) {
for (; f < e; --e) {
cout << nums[e] << ',';
}
cout << nums[f];
}
else {
for (; f < e; ++f) {
cout << nums[f] << ',';
}
cout << nums[e];
}
}
cout << "]\n";
}
}
return 0;
}
TMIPermalink
WA 3번이나 났는데,
문제 잘 안읽고, 주어지는 숫자가 한자릿수인줄 알고 풀었었다.
void WA() {
cin >> t;
while (t--) {
cin >> p >> n >> x;
f = 0;
e = n - 1;
err = false;
isReversed = false;
for (auto&& m : p) {
if (m == 'R') {
isReversed = !isReversed;
}
else {
if (f > e) {
err = true;
break;
}
if (!isReversed) {
++f;
}
else {
--e;
}
}
}
if (err) {
cout << "error" << endl;
}
else {
cout << '[';
if (f <= e) {
if (isReversed) {
for (; f < e; --e) {
cout << x[e * 2 + 1] << ',';
}
cout << x[f * 2 + 1];
}
else {
for (; f < e; ++f) {
cout << x[f * 2 + 1] << ',';
}
cout << x[e * 2 + 1];
}
}
cout << "]\n";
}
}
}
전역전 휴가~ :)
댓글남기기