본문 바로가기

알고리즘/문제 풀이

💚 5430 AC JAVA

목차
1. 문제 설명
2. 원리 설명 
3. 코드 분석 

1. 문제 설명 

https://www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

2. 원리 설명 

해당 문제는 deque라는 양방향에서 add, poll이 가능한 자료구조를 이용하여 문제를 풀었다. 

아직 deque가 낯선 분들은 여기로 가서 봐주세요

https://velog.io/@sdk1926/deque%EB%8A%94-%EC%99%9C-%EC%93%B8%EA%B9%8C

toggle(boolean) 값을 두었다. 그래서 R이라는 명령어가 들어오면 true, false를 토글했다. true는 앞을 가리키고, false는 뒤를 가리킨다. D라는 명령어가 들어오면 toggle 방향에 따라 머리 혹은 꼬리에서 값을 poll했다.


한 번 틀린 이유: deque가 비었을 때, D 명령어가 들어오면 error를 출력해야하고, 명령어가 다 끝난 뒤에 배열이 비어있으면 그대로 [ ]를 출력해야 했다. 이 부분 예외처리를 안해줘서 틀렸다. 

 

3. 코드 분석 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Array;
import java.util.*;

// 5430번 AC
public class Main {

    // T: Testcase, p: 명령어의 개수, n: 배열안의 수의 개수
    static int T,n;

    // orders: 명령어가 일렬로 들어가있는 문자열
    static String orders;

    // arr: 숫자가 들어있는 배열
    static String [] arr ;




    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        T = Integer.parseInt(br.readLine());


        for (int t = 0; t < T; t++) {

            // 1) 값 입력 받기

            orders = br.readLine();
            n = Integer.parseInt(br.readLine());
            String temp = br.readLine();
            if(temp.equals("[]")){
                arr = new String[0];
            }else{
                arr = temp.substring(1,temp.length()-1).split(",");
            }

            int isError = 0;

            // 2) Deque에 넣기
            ArrayDeque<String> aq1 = new ArrayDeque<>();
            aq1.addAll(Arrays.asList(arr));

            // 3) Reverse toggle을 두고 R이 들어올 때마다 위치 바꾸기
            //    true -> front, false -> rear
            boolean toggle = true;

            for (int i = 0; i < orders.length(); i++) {

                if(orders.charAt(i) == 'R'){
                    toggle = !toggle;
                }
                if(orders.charAt(i) == 'D'){

                    if(aq1.isEmpty()){
                        isError = 1;
                        break;
                    }

                    if(toggle){
                        aq1.pollFirst();
                    }
                    else{
                        aq1.pollLast();
                    }
                }
            }


            // 출력 부분
            if(aq1.isEmpty()){
              if(isError == 0){
                  System.out.println("[]");
              }else {
                  System.out.println("error");
              }
            } else if (!toggle) {

                StringBuilder sb = new StringBuilder().append("[");

                int Qsize = aq1.size();
                for (int i = 0; i < Qsize; i++) {
                    sb.append(aq1.pollLast());
                    if(i != Qsize-1){
                        sb.append(",");
                    }
                }

                sb.append("]");

                System.out.println(sb);
            } else {
                StringBuilder sb = new StringBuilder().append("[");

                int Qsize = aq1.size();
                for (int i = 0; i < Qsize; i++) {
                    sb.append(aq1.poll());

                    if(i != Qsize-1){
                        sb.append(",");
                    }
                }

                sb.append("]");
                System.out.println(sb);
            }


        }

    }
}

 

 

'알고리즘 > 문제 풀이' 카테고리의 다른 글

💔 백준 14500 테트로미노  (0) 2024.04.09
💔 백준 2503 숫자야구 JAVA  (0) 2024.04.07
💔 14889. 스타트와 링크  (0) 2024.03.08
💜 2589 보물섬  (0) 2024.03.06
💜 2667번 단지 번호 붙이기 JAVA  (0) 2024.03.02