접근 방법
자료구조 덱 ( Deque )을 사용하는 문제다.
Deque
Deque 는 Double-Ended Queue의 약자로 말 그대로 끝이 두개인, 양쪽에서 데이터를 넣고 뺄 수 있는 양방향 큐다.
자바에서는 ArrayDeque<>를 이용해서 사용할 수 있다. 아래는 간단한 메소드들.
- deque.append(item): item을 덱의 오른쪽 끝에 삽입한다.
- deque.appendleft(item): item을 덱의 왼쪽 끝에 삽입한다.
- deque.pollFirst(): 덱의 왼쪽 끝 엘리먼트를 삭제하고 리턴한다.
- deque.pollLast(): 덱의 오른쪽 끝 엘리먼트를 삭제하고 리턴한다.
- deque.remove(item): item을 데크에서 찾아 삭제한다.
문제를 처음 풀 때는 배열을 뒤집기를 직접 구현하다가 시간 초과가 났다. 다시 생각해보면 굳이 뒤집을 필요가 없다.
boolean 변수를 사용해서 true / false 값에 따라 순서를 결정하면 된다.
예를 들면, true 라면 pollFirst() 를, false 라면 pollLast() 를 사용하면 된다.
나머지는 요구하는대로 구현하면 크게 어려울 것 없다.
코드
import java.util.*;
public class Main {
static Scanner in = new Scanner(System.in);
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
ArrayDeque<Integer> deque;
StringTokenizer st;
int T = in.nextInt();
while(T-- > 0){
String p = in.next();
int n = in.nextInt();
st = new StringTokenizer(in.next(), "[],");
deque = new ArrayDeque<Integer>();
for(int i = 0; i < n; i++){
deque.add(Integer.parseInt(st.nextToken()));
}
AC(p, deque);
}
System.out.println(sb);
in.close();
}
static void AC(String p, ArrayDeque<Integer> deque){
boolean reverse = true;
for(int i = 0; i < p.length(); i++){
if(p.charAt(i) == 'R'){
reverse = !reverse;
continue;
}
if(reverse) {
if(deque.pollFirst() == null){
sb.append("error").append("\n");
return;
}
}
else {
if(deque.pollLast() == null) {
sb.append("error").append("\n");
return;
}
}
}
sb.append('[');
if(deque.size() > 0) {
if(reverse) {
sb.append(deque.pollFirst());
while(!deque.isEmpty()) {
sb.append(',').append(deque.pollFirst());
}
}
else {
sb.append(deque.pollLast());
while(!deque.isEmpty()) {
sb.append(',').append(deque.pollLast());
}
}
}
sb.append(']').append("\n");
}
}
'알고리즘 > Class 3' 카테고리의 다른 글
백준 BOJ 6064번 - 카잉 달력 (0) | 2022.09.23 |
---|---|
백준 BOJ 5525번 - IOIOI (0) | 2022.09.05 |
백준 BOJ 2667번 - 단지번호붙이기 (0) | 2022.08.31 |
백준 BOJ 2630번 - 색종이 만들기 (0) | 2022.08.31 |
백준 BOJ 2606번 - 바이러스 (0) | 2022.08.30 |
댓글