건전한 건전지
article thumbnail
728x90
반응형

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

 

27497번: 알파벳 블록

첫째 줄에 버튼을 누른 횟수 $N$이 주어진다. $(1 \leq N \leq 1\,000\,000)$ 둘째 줄부터 $N$개의 줄에는 버튼을 누른 순서대로 누른 버튼에 대한 정보를 주며 아래와 같은 형식으로 주어진다. 1 c : 문자열

www.acmicpc.net

구현해야 하는 기능은 3개

1. 문자열 맨 뒤에 문자 추가

2. 문자열 맨 앞에 문자 추가

3. 가장 나중에 추가된 문자 제거. 단, 문자열이 비었을 때는 작동 없이 넘어감

 

1, 2는 deque를 이용해서 구현하면 되고 3번은 스택을 사용하여 구현하면 되는 문제이다.

문자열을 저장하고 삭제할 deque와 최근 문자가 무엇인지 기억할 Stack을 이용해서 풀면 된다.

 

#include <bits/stdc++.h>
using namespace std;

int main() {
	cin.tie(0);
	cout.tie(0);
	ios_base::sync_with_stdio(0);

	deque <char> dq;
	
	stack <int> lastOrder;

	int n; cin >> n;

	for (int i = 0; i < n; i++) {
		int order; cin >> order;

		if (order == 1) {
			lastOrder.push(1);
			char c; cin >> c;
			dq.push_back(c);
		}
		else if (order == 2) {
			lastOrder.push(0);
			char c; cin >> c;
			dq.push_front(c);
		}
		else {
			if (!lastOrder.empty()) {
				int dir = lastOrder.top();
				lastOrder.pop();

				// 1인 경우 뒤에서 빼기
				if (dir) {
					dq.pop_back();
				}
				// 0인 경우 앞에서 빼기
				else {
					dq.pop_front();
				}
			}
		}
		
	}

	if (dq.size() == 0) {
		cout << "0";
	}
	else {
		for (auto i = dq.begin(); i != dq.end(); i++)
			cout << *i;
	}
}

 

Stack <int> lastOrder를 선언하여 뒤에 들어갔을 경우 1을 앞에 들어갔을 경우 0을 스택에 push해준다.

3번 연산을 입력받아 삭제해야 할 때에는 스택에서 하나씩 pop을 하며 1인 경우 뒤에서, 0인 경우 앞에서 문자를 삭제해준다.

 

 

728x90
반응형
profile

건전한 건전지

@건전한 건전지

나는 언리얼의 왕이 될 남자다 👑