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


풀이
처음에는 그냥 Queue를 사용해서 풀려고 했다
그런데 뒤집힌 상태에서 원소를 빼야하는데 그렇게 하려면 모든 원소를 다 빼고 넣어야해서 굉장히 복잡했다
그래서 Deque를 사용하기로 했다
체크할 사항이 엄청 많은 문제였다
이 문제를 효율적으로 푸는 방법은 R이 나왔을 때 실제 원소들을 뒤집지 않고 변수를 선언하여 뒤집힌 상태를 저장하는 것이다
1. 기본 상태
- D 연산 -> 정상적으로 앞에서 원소를 빼면 된다. `deque.removeFirst()`
- 최종 출력 -> `deque.removeFirst()`
2. 뒤집힌 상태
- D 연산 -> 뒤집혔기 때문에 뒤에서 원소를 빼면 된다. `deque.removeLast()`
- 최종 출력 -> `deque.removeLast()`
에러를 발생시키는 상황도 따로 저장해주어 StringBuilder로 한번에 출력했다
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
while (T-- > 0) {
String p = br.readLine();
int n = Integer.parseInt(br.readLine());
String str = br.readLine();
Deque<String> deque = new ArrayDeque<>();
if (n > 0) {
// 입력이 [ , , ] 형태이므로 괄호 제외 "," 로 구분해서 파싱
String[] strArr = str.substring(1, str.length() - 1).split(",");
for (String s : strArr) {
// 큐에 넣어준다
deque.add(s);
}
}
boolean isError = false; // 에러 발생 상태
boolean isReverse = false; // 뒤집힘 상태
for (char cmd : p.toCharArray()) {
if (cmd == 'R') {
isReverse = !isReverse; // 방향 전환
} else {
// D 연산
// 큐가 비어있으면 에러 상태
if (deque.isEmpty()) {
isError = true;
break;
}
if (isReverse) {
// 뒤집혀 있다면 큐 뒤에서 원소 제거
deque.removeLast();
} else {
// 뒤집혀 있지 않다면 큐 앞에서 원소 제거
deque.removeFirst();
}
}
}
// 에러 상태면 error 출력
if (isError) {
sb.append("error\n");
} else {
// 문제 요구사항 형태에 맞게 출력
sb.append("[");
if(!deque.isEmpty()) {
if (isReverse) {
// 뒤집혀 있다면 뒤에서 원소를 빼서 출력
sb.append(deque.removeLast());
while (!deque.isEmpty()) {
sb.append(",").append(deque.removeLast());
}
} else {
// 뒤집혀 있지 않다면 앞에서 원소를 빼서 출력
sb.append(deque.removeFirst());
while (!deque.isEmpty()) {
sb.append(",").append(deque.removeFirst());
}
}
}
sb.append("]").append("\n");
}
}
System.out.println(sb);
br.close();
}
}
결과
