백준 5430

찬들이·2022년 7월 29일
0

알고리즘

목록 보기
18/42
post-custom-banner

문제 5430번(성공)

소스코드

import java.io.*;
import java.util.*;
public class boj5430ver2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        while(T>0){
            String input1 = br.readLine();
            char[] order = input1.toCharArray();
            int N = Integer.parseInt(br.readLine());
            Deque<String> dq = new ArrayDeque<>();
            String input = br.readLine();
            input = input.substring(1, input.length()-1);
            if(N != 0){
                st = new StringTokenizer(input, ",");
            }
            else{
                if(input1.contains("D")){
                    sb.append("error\n");
                }else{
                    sb.append("[]\n");
                }
                continue;
            }
            for (int i = 0; i < N; i++) {
                dq.add(st.nextToken());
            }
            boolean r = true;
            boolean isTrue = false;
            for (int i = 0; i < order.length; i++) {
                if(order[i] == 'R'){
                    r = !r;
                }else {
                    if (!dq.isEmpty()) {
                        if (r) {
                            dq.pollFirst();
                        } else {
                            dq.pollLast();
                        }
                    }else{
                        isTrue = true;
                        break;
                    }
                }
            }
            if(!isTrue){
                sb.append("[");
                if(r){
                    while(dq.size()>1){
                        sb.append(dq.pollFirst() +",");
                    }
                }else{
                    while(dq.size()>1){
                        sb.append(dq.pollLast() + ",");
                    }
                }
                if(dq.size() != 0){
                    sb.append(dq.pollLast() + "]\n");
                }
            }else{
                sb.append("error\n");
            }
            T--;
        }
        System.out.println(sb);
    }
}

풀이접근

  1. 처음에는 Queue 자료구조를 생각 했고, Queue를 통해 문제를 해결 했다.
  2. queue를 통해서는 reverse 부분에서 시간이 많이 걸려서 deque로 전환 했다.
  3. deque를 사용하여 reverse를 boolean변수 하나에 지정하여 앞 부터 꺼내거나, 뒤 부터 꺼내는 방식으로 접근했다.
  4. 가장 먼저 숫자가 없는 배열일 경우를 예외처리한다.
    -> 숫자가 없는데 D명령어가 존재 할 경우는 error, 없을 경우는 []
  5. 뒤집어진 배열인지 판단하기 위한 r변수와 비어 있는 데큐에 D 명령이 들어왔을 경우를 찾아줄 isTrue 불린 변수들을 만들어 준다.
  6. 문제 조건에 맞게 명령어를 처리하는 소스코드를 작성하고, isTrue가 true 인 경우에는 error를, 아닌 경우에는 문제에서 원하는 출력 방식을 reverse를 판단하여 StringBuilder로 출력한다.

문제 핵심

  • 시간복잡도를 줄일 수 있는지!
  • 문제에 어울리는 자료구조를 사용 했는지!
profile
Junior-Backend-Developer
post-custom-banner

0개의 댓글