사용한 것
- 문자열에서 원하는 문자만 추출하기 위한 문자열 파싱
- 앞, 뒤에서 모두 원소를 꺼내기 위한 Deque
풀이 방법
- 명령들의 집합인 문자열
p
가 주어지는데 'R'은 뒤집기, 'D'는 삭제이다.
- 따라서 Deque을 사용한다.
!reverse
상태에서 삭제하려면 removeFirst()
, reverse
상태에서 삭제하려면 removeLast()
를 실행하면 되기 때문이다
- 만약 더이상 원소가 없는데 'D' 명령어가 들어오면 "error"를 출력한다.
- 명령을 모두 마친 상태에서 다시 배열 형태로 반환할 때에도 마찬가지이다.
- 마지막으로
!reverse
상태면 removeFirst()
, reverse
상태면 removeLast()
를 실행하면서 원소들을 꺼내어 배열 형태로 변환하여 출력하면 된다.
코드
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
String p = br.readLine();
int n = Integer.parseInt(br.readLine());
String line = br.readLine();
line = line.substring(1, line.length() - 1);
StringTokenizer st = new StringTokenizer(line, ",");
Deque<Integer> deque = new ArrayDeque<>();
while (st.hasMoreTokens()) {
deque.addLast(Integer.parseInt(st.nextToken()));
}
boolean reverse = false;
boolean error = false;
for (int j = 0; j < p.length(); j++) {
if (p.charAt(j) == 'R') {
reverse = !reverse;
} else {
if (deque.size() == 0) {
error = true;
break;
}
if (!reverse) {
deque.removeFirst();
} else {
deque.removeLast();
}
}
}
if (error) {
System.out.println("error");
continue;
}
StringBuilder output = new StringBuilder("[");
if (!reverse) {
while (!deque.isEmpty()) {
output.append(deque.removeFirst());
if(!deque.isEmpty()) {
output.append(",");
}
}
} else {
while (!deque.isEmpty()) {
output.append(deque.removeLast());
if(!deque.isEmpty()) {
output.append(",");
}
}
}
output.append("]");
System.out.println(output);
}
}
}