문제(출처: 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에서 값을 하나씩 꺼내 출력한다.
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 16194_카드 구매하기 2 (1) | 2023.11.28 |
---|---|
[Baekjoon] 11052_카드 구매하기 (1) | 2023.11.27 |
[Baekjoon] 2872_우리집엔 도서관이 있어 (1) | 2023.11.23 |
[Baekjoon] 5212_지구 온난화 (1) | 2023.11.22 |
[Baekjoon] 18429_근손실 (0) | 2023.11.21 |