본문 바로가기

Algorithm/백준

[백준] 5430번: AC

https://www.acmicpc.net/problem/5430

 

5430번: AC

문제 선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다. 함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다. 함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다.

www.acmicpc.net

문제는 간단하다

숫자 리스트를 입력받은 후, R이면 리스트의 순서를 뒤집어주고 D면 맨 앞 원소를 버린다.

덱을 이용하면 굳이 리스트의 순서를 뒤집어줄 필요 없이 pop의 방향만 바꾸어 주면 된다.

 

따라서 pop의 방향을 저장할 direct라는 bool형 변수를 선언한 뒤,

R일때는 direct의 값을 바꿔주고

D일 때는 direct에 따라 pop_front 또는 pop_back 해주면 된다.

 

그러나 입력 받은 리스트 문자열을 덱에 넣어주는 작업이 번거롭다ㅜㅜ 이부분만 잘 구현해줄 것

 

#include <iostream>
#include <string>
#include <deque>

using namespace std;

int main() {
	int T;
	cin >> T;
	
	while (T--) {
		string p;
		int n;
		bool direct;		// 1: 정방향, 0: 역방향
		deque<int> d;
		string temp;
		cin >> p >> n >> temp;
		direct = 1;

		// 변환----------------------------------
		string num;
		for (int i = 0; i < temp.length(); i++) {
			if (temp[i] >= '0' && temp[i] <= '9') {
				num += temp[i];
			}
			else if (!num.empty()) {
				d.push_back(stoi(num));
				num.clear();
			}
		}

		// 함수 계산----------------------------
		int i;
		for (i = 0; i < p.length(); i++) {
			if (p[i] == 'R') {
				direct = !direct;
			}
			else if (p[i] == 'D') {
				if (d.empty()) break;

				if (direct) {
					d.pop_front();
				}
				else {
					d.pop_back();
				}
			}
		}

		// 프린트--------------------------------
		if (i == p.length()) {
			printf("[");
			while (!d.empty()) {
				if (direct) {
					printf("%d", d.front());
					d.pop_front();
				}
				else {
					printf("%d", d.back());
					d.pop_back();
				}
				if (d.empty()) break;
				printf(",");
			}
			printf("]\n");
		}
		else {
			printf("error\n");
		}
	}
}

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

[백준] 1935번: 후위 표기식2  (0) 2020.03.19
[백준] 1918번: 후위 표기식  (0) 2020.03.19
[백준] 3078번: 좋은 친구  (0) 2020.03.19
[백준] 10993번: 별 찍기 - 18  (0) 2020.03.15
[백준] 3190번: 뱀  (0) 2020.03.12