티스토리 뷰

#include <iostream>
#include <deque>
#include <stack>

using namespace std;

int main(void) {
	deque<char> d; //덱 구현
	stack<char> stack; //stack 구 현 
	
	int n, cnt=0;
	scanf("%d", &n);
	
	for(int i = 0; i<n; i++) {
		int tmp;
		char c;
		scanf("%d", &tmp);
		getchar(); //buffer의 '\n'제거
		switch(tmp) {
			case 1:
				scanf(" %c", &c);
				d.push_back(c); //뒤로 넣고
				stack.push('1'); //들어온 순서를 담을 스택에 넣어준다
				cnt++;
				break;
			case 2:
				scanf(" %c", &c);
				d.push_front(c); //앞으로 넣고
				stack.push('2'); //들어온 순서를 담을 스택에 넣어준다
				cnt++;
				break;
			case 3:
				if(!cnt) break; 
				if(stack.top() == '1') d.pop_back(); //가장 최근에 들어온 것을 덱에서 빼낸다.
				else d.pop_front();
				stack.pop();
				cnt--;
				break;
		}
	}
	
	if(!cnt) {  //덱이 비었으면
		printf("0"); //0을 출력
		return 0; 
	}
	while(cnt--) {
		printf("%c", d.front()); //덱이 안비었다면, 앞에서부터 꺼내서 출력
		d.pop_front();
	}
}

 

풀이 : 덱, 큐

1. 덱, 큐를 STL로 만듭니다.

2. n을 입력 받습니다.

3. 1을 입력받으면 문자를 뒤로, 2을 입력받으면 앞으로 넣고, 3일 경우 만약 덱에 요소가 있다면, 가장 최근에 들어온 것을 꺼냅니다.

4. 가장 최근에 들어온것을 알기위해, stack을 이용하여, 문자를 덱에 넣을 때마다 어디로 넣는지를 넣어줍니다.

그러면 가장 최근엔 어떻게 들어갔는지를 알 수 있게됩니다.

5. 덱이 비었으면 0, 비지 않았다면, 앞에서부터 차례차례 출력합니다.

 

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

 

27497번: 알파벳 블록

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

www.acmicpc.net

 

'c++ > BAEKJOON' 카테고리의 다른 글

c++ 13537번 수열과 쿼리 1 (백준)  (0) 2023.06.30
c++ 2504번 괄호의 값 (백준)  (0) 2023.05.05
c++ 1835번 카드 (백준)  (0) 2023.04.02
c++ 16120번 PPAP (백준)  (0) 2023.03.18
c++ 6198번 옥상 정원 꾸미기 (백준)  (0) 2023.03.15
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함