백준 5430 - AC

2 minute read

문제링크

문제설명

  • 두 가지 함수 R(뒤집기), D(맨 앞 숫자 버리기)가 있다.
  • 수행할 함수 p는 R과 D의 조합으로 이루어져 있으며, 숫자가 담긴 배열이 주어졌을 때 함수 p를 실행한 결과를 출력
    • 비어 있을 떄 D 함수를 수행하게 되는 경우 error 를 출력해야 한다.
    • 함수 p를 수행한 이후에 배열이 비어 있다면 [] 를 출력한다.

시간초과 해결 방법

  • 처음에는 주어진 함수 p에 대해서 R, D 함수를 모두 수행하게 했다. 즉, 함수 p에 RRRRRR 와 같이 순서를 뒤집는 의미가 없는 경우에도 뒤집는 로직을 실행하면서 시간초과에 걸렸다.
    • 더불어, 뒤집는 로직도 새로운 배열에 모두 push_back() 을 수행하는 방법으로 구현했는데, p의 길이가 최대 60만인 것을 고려했을 때 결코 적은 시간이 아니라고 생각했다.
  • 처음 입력받은 함수 p에 대해서 R의 개수가 홀수일때만 한번 실행할 수 있도록 한다.
  • 배열이 빈 상태에서 D 함수를 실행하게 되면 error 를 출력하고 해당 케이스는 바로 빠져나올 것
  • R 함수의 경우 순방향인지, 역방향인지만 바꿔주도록 하고 덱(deque) 자료구조를 이용하여 pop_front(), pop_back() 메서드를 활용하여 D 함수를 구현

구현

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <cctype>
#include <deque>
using namespace std;

int dir; // 0: 정방향, 1: 역방향

int functionD(deque<int>& dq) {
	if (dq.size() == 0) return -1;

	if (dir == 0) dq.pop_front();
	else dq.pop_back();

	return 1;
}

void command(string p, deque<int>& dq) {
	for (int i = 0; i < p.size(); i++) {
		if (p[i] == 'R') {
			dir = ~dir; // not 연산
		}
		else if (p[i] == 'D') {
			if (functionD(dq) == -1) {
				printf("error\n");
				return;
			}
		}
	}

	printf("[");
	if (dir == 0) {
		for (int i = 0; i < dq.size(); i++) {
			if (i == dq.size() - 1) printf("%d", dq[i]);
			else printf("%d,", dq[i]);
		}
	}
	else {
		for (int i = dq.size() - 1; i >= 0; i--) {
			if (i == 0) printf("%d", dq[i]);
			else printf("%d,", dq[i]);
		}
	}
	printf("]\n");
}

string getRealP(string p) {
	string ret;
	int cnt = 0;
	for (int i = 0; i < p.length(); i++) {
		if (p[i] == 'R') {
			cnt++;
		}
		else if (p[i] == 'D') {
			if (cnt == 0) {
				ret.push_back(p[i]);
				continue;
			}
			if (cnt % 2 == 1) ret.push_back('R');
			ret.push_back(p[i]);
			cnt = 0;
		}
	}
	if (cnt > 0 && cnt % 2 == 1) 
		ret.push_back('R');

	return ret;
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int T;
	cin >> T;
	for (int testCase = 0; testCase < T; testCase++) {
		dir = 0;
		string p;
		cin >> p;
		p = getRealP(p);
		int n; 
		cin >> n; getchar();
		string origin, numArr;
		cin >> origin;
		for (int i = 0; i < origin.size(); i++) {
			if (origin[i] == '[' || origin[i] == ']') continue;
			numArr.push_back(origin[i]);
		}
		deque<int> dq;
		stringstream ss(numArr);
		string token;
		int num;
		while (getline(ss,token, ',')) {
			num = stoi(token);
			dq.push_back(num);
		}
		command(p, dq);
	}
	return 0;
}

Leave a comment