문제

 

입력

 

출력

 

 


 

 

문제 해결

반례에 주의하자!!

R : 배열을 reverse하는 연산

D : 배열의 앞 원소를 pop하는 연산

R이 홀수개이면 마지막에 한 번만 reverse 연산을 하여 시간 복잡도를 개선한다. 대신 flag를 세워 앞에서 pop 할 건지, 뒤에서 pop 할 건지 체크해야 한다.

 

반례는 크게 세 가지가 있는데, 코드 블럭 내에 적혀있다.

 

 

코드

#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

int t, n, z, res;
string s1, s2;
list<int> v;

/*
* 반례
* 1. 빈 배열에서 pop하는 경우 : error 출력
* 2. 빈 배열에서 R하는 경우 : [] 출력
* 3. 모든 함수 수행 후 빈 배열이 되는 경우 : [] 출력
*/
string input() {

	int sum = 0;
	
	cin >> s1 >> n >> s2;

	for (int i = 1; i < s2.size(); i++) {

		if (s2[i] >= '0' && s2[i] <= '9')
			sum = 10 * sum + (int)(s2[i] - 48);		// '0' = 48, '9' = 57
		else if (s2[i] == ',' || s2[i] == ']') {
			if (!n) break;
			v.push_back(sum);
			sum = 0;
		}
	}
		
	return s1;
}

int solution(string s1) {	// error : 0, not error : 1, empty array : 2

	int s = s1.size();
	int c = 1, cnt = 0;
	bool flag = true;		// true일 때는 pop_front, false일 때는 pop_back

	for (int i = 0; i < s; i++) {
		if (s1[i] == 'R') {
			if (!v.size()) c = 2;	// 2. 빈 배열에서 R하는 경우 : [] 출력
			flag = !flag;
			cnt++;
		}
		else if (s1[i] == 'D') {
			if (!v.size()) return 0;	// 1. 빈 배열에서 pop하는 경우 : error 출력
			flag ? v.pop_front() : v.pop_back();
		
		}
	}

	if (cnt % 2) reverse(v.begin(), v.end());	// R 연산이 홀수개인 경우 마지막에 한 번만 reverse
	if (!v.size()) c = 2;			// 3. 모든 함수 수행 후 빈 배열이 되는 경우 : [] 출력
	return c;
}


int main() {

	cin >> t;

	while (t--) {
		v.clear();
		res = solution(input());
		int z = v.size();

		if (!res) {
			cout << "error" << '\n';
			continue;
		}
		else if (res == 2) {
			cout << "[]" << '\n';
			continue;
		}

		cout << '[';
		list<int>::iterator iter = v.begin();
		for (int i = 0; i < z - 1; i++) {
			cout << *iter << ',';
			iter++;
		}
		cout << *iter << ']' << '\n';

	}
}

'🎲 BOJ > 🥇' 카테고리의 다른 글

[C++] 백준 4256 : 트리  (0) 2023.08.06
[C++] 백준 20922 : 겹치는 건 싫어  (0) 2022.02.09
[C++] 백준 1072 : 게임  (0) 2022.02.08
[C++] 백준 2533 : 사회망 서비스(SNS)  (0) 2022.02.07

+ Recent posts