본문 바로가기
알고리즘/Class 3

백준 BOJ 5430번 - AC

by edvedv 2022. 9. 4.


접근 방법

 

자료구조 덱 ( 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");
   }
}

댓글