🌞Algorithm/🔥Baekjoon

[Baekjoon] 27497_알파벳 블록

뿌야._. 2023. 11. 24. 15:47

Silver II

문제(출처: https://www.acmicpc.net/problem/27497)

< 알파벳 블록 >

 

문제 풀이 

 

deque와 stack을 사용해서 문제를 해결했다. deque에는 문자열을 넣고, stack에는 문자열을 앞에 넣었는지 뒤에 넣었는지 판별하도록 정보를 저장한다.

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Stack;
import java.util.StringTokenizer;

public class _27497_ { // 알파벳 블록

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		int n = Integer.parseInt(bf.readLine());

		Deque<Character> deque = new ArrayDeque<>();
		Stack<Boolean> stack = new Stack<>();

		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(bf.readLine());

			int cmd = Integer.parseInt(st.nextToken());

			if (cmd == 1 || cmd == 2) {
				char x = st.nextToken().charAt(0);
				if (cmd == 1) {
					stack.add(false);
					deque.addLast(x);
				} else {
					stack.add(true);
					deque.addFirst(x);
				}
			} else {
				if (deque.isEmpty()) {
					continue;
				}
				boolean flag = stack.pop();
				if (flag) {
					deque.removeFirst();
				} else {
					deque.removeLast();
				}
			}
		}

		if (deque.isEmpty()) {
			bw.write("0");
		} else {
			while (!deque.isEmpty()) {
				bw.write(deque.pollFirst());
			}
		}
		bw.flush();
	}
}
변수)
n : 버튼을 누른 횟수
deque : 문자열 구성하는 블록 저장
stack : 문자열을 앞에 추가했는지 뒤에 추가했는지 저장
cmd : 1(문자열 맨 뒤에 추가), 2(문자열 맨 앞에 추가), 3 (가장 나중에 추가된 블록 제거)
x : 문자열

 

1을 입력받은 경우 deque의 addLast를 사용하여 맨 뒤에 추가하고, 2를 입력받은 경우 deque의 addFirst를 사용하여 맨 앞에 추가한다. 3을 입력받은 경우 stack에서 값을 하나 꺼내와 값이 false라면 removeLast를 사용하여 맨 뒤 값을 제거하고, true라면 removeFirst를 사용하여 맨 앞의 값을 제거한다.

 

최종 deque가 비었다면 0을 출력하고 비어있지 않다면 deque에서 값을 하나씩 꺼내 출력한다.