[백준] 5430 AC(Java)

수경·2022년 12월 16일
0

problem solving

목록 보기
87/174

백준 - 5430 AC

풀이

Deque 덱 사용

Deque : 양방향 입출력이 가능한 큐

  1. D : 배열의 앞 요소 삭제 ➡️ isReverse 에 따라 pollFirst / pollLast
  2. R : 배열을 뒤집음 ➡️ 뒤집지 않고 isReverse 변수에 뒤집힌 배열인지 아닌지 여부를 저장해줌

삽질

만약 배열이 뒤집힌 상태 (isReverse = true) 이면 배열을 뒤집어서 출력해야 하는데 잘못 생각해서 오래걸렸다.

예시로 크기가 2인 배열을 뒤집어서 출력한다고 했을때,
[1,2] -> [2,1] 로 출력해야 하는 걸 생각하고 덱을 그대로 쓰고싶어서 '아! 뒤에 있는 요소를 앞으로 넣으면 되겠다' 하고 잘못 접근...

[1,2,3] 의 경우 위와 같이 풀면 [3,1,2] 처럼 돼서 절대 답이 될 수 없다!

이 생각을 안하고 풀어서 결국 하나하나 다시 접근하도록 했다!
(스터디에서 해결사를 담당하고 계시는 스터디원분이 해결해주셨다 ㅠㅠ 감사합니다)

암튼 해결!


코드

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

public class AC {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int num = Integer.parseInt(br.readLine());
		String[] result = new String[num];

		for (int i = 0; i < num; i++) {
			String[] command = br.readLine().split("");
			int len = Integer.parseInt(br.readLine());
			Deque<Integer> deque = new ArrayDeque<>();
			StringTokenizer st = new StringTokenizer(br.readLine(), "[,]");
			for (int a = 0; a < len; a++) deque.add(Integer.parseInt(st.nextToken()));
			result[i] = ac(deque, command);
		}

		for (String r : result) System.out.println(r);
	}

	private static String ac(Deque<Integer> deque, String[] command) {
		boolean isReverse = false;
		for (String c : command) {
			if (c.equals("D")) {
				if (deque.isEmpty()) {
					return "error";
				}
				if (!isReverse) deque.pollFirst();
				else deque.pollLast();
			}
			else if (c.equals("R")) {
				isReverse = !isReverse;
			}
		}
		if (isReverse) {
			Deque<Integer> newDeque = new ArrayDeque<>();
			int size = deque.size();
			for (int i = 0; i < size; i++) {
				newDeque.addLast(deque.pollLast());
			}
			deque = newDeque;
		}
		return deque.toString().replaceAll(" ", "");
	}
}
profile
어쩌다보니 tmi뿐인 블로그😎

0개의 댓글