boj5430-풀이

boj.kr/5430 AC (문제)

문제설명Permalink


단순한 구현문제

정수 배열이 주어지고, R, D연산을 할 수 있다.
R 연산 : 배열을 뒤집는다. a1~an -> an~a1
D 연산 : 첫 원소를 삭제한다. a1~an -> a2~an

모든 연산이 완료된 상태의 배열을 출력한다.
단, 배열의 원소가 존재하지 않을 때, D연산이 일어난 경우 error를 출력한다.

풀이Permalink


단순하게 배열을 놓고 삭제, 뒤집기를 구현해도 된다.
이 풀이에서는 최대한 배열에 대해서 실제 연산을 피하기 위해서,
배열의 시작 인덱스(f), 끝 인덱스(e), 뒤집어짐 여부(isReversed)를 놓고 하겠다.

뒤집어짐 상태에 따라서 원소를 삭제할때 시작 또는 끝의 인덱스를 변경해야한다.

  1. 뒤집어지지 않은 경우 isReversed = false
    시작의 인덱스를 뒤로 당김
  2. 뒤집어진 경우 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";
		}
	}
}

전역전 휴가~ :)

댓글남기기