서의 공간

[백준] 5430_AC 본문

Algorithm/백준

[백준] 5430_AC

홍서의 2021. 1. 13. 20:31

[문제]: 5430번: AC (acmicpc.net)

 

이 문제의 핵심은 D 앞에 있는 R의 개수가 짝수인지 홀수인지 아는 것이다.

D 앞에 R이 짝수개이면 짝수개의 R에 대해 뒤집는 연산은 의미가 없다. 따라서 D 연산을 할 때 앞에 원소를 삭제하면 된다.

만약 R이 홀수개라면 뒤집는 연산을 딱 한번만 한 것과 같으므로 한 번만 뒤집는다, 그러나 실제로는 배열을 뒤집지 않고 마지막 원소를 삭제하는 방법으로 원소를 삭제하는 위치만 바꾸어서 구현했다.

또한 실제로는 D 앞에 R이 짝수개인지 홀수개인지 카운트 하지 않고 짝수개이면 popWhere = false로, 홀수개이면 popWhere = true로 두어 D 연산이 삭제할 위치를 결정했다.

마지막에는 R의 총 개수가 짝수개인지 홀수개인지 확인해서 최종 배열을 뒤집지 말지 결정한다.

 

해당 문제는 다른 것보다 입력과 출력부분이 귀찮다.

#include <iostream>
#include <string>
#include <deque>
#include <algorithm>
using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	
	int T;
	cin >> T;
	while (T--) {
		string f, str;
		int n;
		cin >> f >> n >> str;
		string num;
		deque<int> deq(n);
		int index = 0;
		for (int i = 1; i < str.size(); ++i) {
			if (isdigit(str[i]))
				num += str[i];
			else if (str[i] == ',' || str[i] == ']') {
				if (num != "") {
					deq[index] = stoi(num);
					++index;
					num.clear();
				}
			}
		}

		bool popWhere = false; // false일 경우 front, true일 경우 back
		bool e = false;
		for (int i = 0; i < f.size(); ++i) {
			if (f[i] == 'R')
				popWhere = !popWhere;
			else if(f[i] == 'D') {
				if (deq.empty()) {
					cout << "error\n";
					e = true;
					break;
				}

				if (popWhere)// popWhere이 true이면 홀수개임.
					deq.pop_back();
				else // popWhere이 false이면 R은 짝수개임.
					deq.pop_front();
			}
		}
		
		if(e == false) {
			if (popWhere)
				reverse(begin(deq), end(deq));

			if (deq.empty())
				cout << "[]\n";
			else {
				cout << '[';
				for (int i = 0; i < deq.size() - 1; ++i)
					cout << deq[i] << ',';
				cout << deq[deq.size() - 1] << "]\n";
			}
		}
	}
	return 0;
}

 

'Algorithm > 백준' 카테고리의 다른 글

[백준] 2447_별 찍기 - 10  (0) 2021.02.06
[백준] 9020_골드바흐의 추측  (0) 2021.02.03
[백준] 2217_로프  (0) 2021.01.11
[백준] 1260_DFS와 BFS  (0) 2021.01.06
[백준] 11399_ATM  (0) 2021.01.05
Comments