새소식

알고리즘 문제풀이/BOJ

[BOJ] 백준 5430번 AC 자바(java) 풀이

  • -

BOJ 5430번 AC 문제 자바(java) 풀이

문제 정리

  1. AC에는 정수 배열을 위한 두 가지 함수가 있다.
    R(뒤집기) : 배열에 있는 숫자 순서를 뒤집는다.
    D(버리기) : 첫 번째 숫자를 버린다.
  2. RDD 처럼 함수를 바로 이어서 사용할 수 있다. 한 번 뒤집은 다음 두개의 숫자를 버린다.
  3. 함수 실행 후, 최종 결과를 구하여라


문제 풀이

수를 실제로 뒤집고 반복한다면 시간초과가 나게 될것입니다.
그러므로 deque를 이용하여 앞 뒤에서 숫자를 지워줍니다.

  1. 파싱하는 것이 중요합니다. 숫자는 한자리수가 아니라 최대 100,000임을 인지해야 합니다.
    이것 때문에 런타임 에러를 많이 봤습니다..ㅠㅠ
  2. 배열에 주어진 수가 하나도 없을때 함수에 D가 포함되어 있다면 에러를 표시합니다.
  3. 그렇지 않다면 '['와 ']'를 잘라내고 ','를 기준으로 parsing하여 deque에 넣습니다.
  4. 그리고 R에 따라서 수를 앞, 뒤로 뺍니다. 만약에 빼려는데 deque가 비었다면 error를 출력합니다.
  5. error 없이 정상적으로 모두 실행했다면 출력형식에 맞게 deque에서 꺼내서 출력합니다.


백준 5430번 AC 자바 소스코드

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

class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringTokenizer st = null;
        for(int tc=1; tc<=T; tc++) {
            String cmdd = br.readLine();
            char[] cmd = cmdd.toCharArray();
            int n = Integer.parseInt(br.readLine());
            Deque<String> dq = new LinkedList<>();

            String input = br.readLine();
            input = input.substring(1, input.length()-1);
            if(n != 0)
                st = new StringTokenizer(input, ",");
            else {
                // 배열에 주어진 수가 없는데 빼려하면 error
                // 빼려하지 않으면 "[]" 출력
                if(cmdd.contains("D"))
                    System.out.println("error");
                else
                    System.out.println("[]");
                continue;
            }

            for(int i=0; i<n; i++)
                dq.add(st.nextToken());            

            // true면 정방향 -> 앞에서 지움
            // false: 역방향 -> 뒤에서 지움
            boolean r = true;
            boolean errorFlag = false;
            for(int i=0; i<cmd.length; i++) {
                // 방향 바꾸기
                if(cmd[i] == 'R')
                    r = !r;                
                else {
                    // 뺄게 없으면 오류
                    if(dq.isEmpty()) {
                        errorFlag = true;
                        break;
                    }
                    // 정방향 이면 앞에서 빼기
                    if(r) 
                        dq.pollFirst();
                    else
                        dq.pollLast();    // 역방향이면 뒤에서 빼기
                }
            }

            // 에러가 안났으면 남은 수 출력
            if(!errorFlag) {
                System.out.print("[");
                if(r) {
                    while(dq.size() > 1)
                        System.out.print(dq.pollFirst() + ",");
                }
                else {
                    while(dq.size() > 1)
                        System.out.print(dq.pollLast() + ",");
                }
                if(dq.size() != 0)
                    System.out.print(dq.getFirst());
                System.out.println("]");
            }
            else {
                System.out.println("error");
            }
        }
   }
}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.