Baekjoon #5430

Baekjoon #5430

2개의 풀이 · Java, Python

문제 원문 보기 ↗

SOLUTION INFO

Java · Main.java

Main.java
/*
시간이 빡빡해서 실제로 뒤집기, 삭제하기를 구현하면 안됩니다.
뒤집기는 실제로 뒤집는 것이 아닌 앞에서 뒤로 읽는걸 뒤에서 앞으로 읽게 하였고
삭제하기는 실제 삭제가 아닌 front포인터를 하나 증가시키는 식으로 구현했습니다.
출력도 빠른 출력을 해야 시간초과가 나지 않습니다. 
*/

import java.util.*;
import java.io.*;

public class Main {
    static ArrayList <String> numlist = new ArrayList<String>();
    static boolean reverse = false;
    static int front, end;
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {
        FastReader rd = new FastReader();

        int T = rd.nextInt();

        for(int i = 0;i < T;i++) {
            String p = rd.nextLine();
            int n = rd.nextInt();

            // inputString => tokenizer로 구분자 제거 후 list에 삽입
            InputString(rd.nextLine());

            boolean error = false;
            for(int j = 0;j < p.length();j++) {
                if(p.charAt(j) == 'R')  
                    ReverseList(); // ListReverse => 뒤집기

                else {
                    if(front > end) {
                        // 에러상황
                        // front가 end보다 큰 상황은 
                        // front == end == 1 인 상황(list에 값이 하나)에서
                        // 하나를 지운 후 상황이다. 즉 지울 것이 없는 상태
                        bw.write("error\n");
                        bw.flush();
                        error = true;
                        break;
                    }
                    else // 지울 수 있는 문자가 있을 때
                        DeleteList(); // DeleteList => 0번 인덱스 삭제
                }
            }
            if(error == false) OutputList();

            numlist.clear();
            reverse = false;
        }
        bw.close();
    }

    static void OutputList() throws IOException{
        bw.write("[");
        // reverse가 false면 정상상태 => 앞(front) 뒤(end)방향으로 출력
        if(reverse == false) {
            for(int i = front;i <= end;i++) {
                if(i == end) bw.write(numlist.get(i));
                else bw.write(numlist.get(i) + ","); 
            }
        }
        // reverse가 true면 뒤집힌 상태 => 뒤(end) 앞(front)방향으로 출력
        else {
            for(int i = end;i >= front;i--) 
                if(i == front) bw.write(numlist.get(i));
                else bw.write(numlist.get(i) + ",");
        }
        bw.write("]\n");
        bw.flush();
    }

    static void DeleteList() {
        // 실제로 지우는 것이 아닌 가리키는 인덱스를 증가 또는 감소시킴
        // 정상 상태이면 앞 인덱스를 증가(앞을 삭제하게 되므로)
        // 뒤집힌 상태이면 뒤 인덱스를 감소(뒤가 가장 앞이 되므로) 
        if(reverse == false) front++;
        else end--;
    }

    static void ReverseList() {
        // 실제로 뒤집는 것이 아닌 뒤집혀있는지 아닌지만 판단
        // 후에 출력할때 출력 순서를 바꾼다
        if(reverse == true) reverse = false;
        else reverse = true;
    }

    static void InputString(String numstr) {
        StringTokenizer st = new StringTokenizer(numstr, "[ | , | ]");

        while(st.hasMoreTokens()) 
            numlist.add(st.nextToken());

        front = 0;
        end = numlist.size() - 1;
    }

    static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() {
            while(st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() { return Integer.parseInt(next()); }
        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }
}

SOLUTION DESCRIPTION

풀이 설명

등록된 풀이 설명이 없습니다.

GITHUB COMMUNITY

커뮤니티 평가

GitHub 계정으로 남긴 최신 평가 1건만 반영하며, 데이터는 매일 저장소에 동기화됩니다.

최근 동기화

체감 난이도

아직 평가 없음

첫 난이도 평가를 남겨주세요.

문제 추천

아직 평가 없음

이 문제가 도움이 되었는지 알려주세요.

이 문제 평가하기

GitHub 로그인 후 난이도를 제출하고, 원하는 경우 추천 여부도 함께 남길 수 있습니다.

추천 여부 (선택)

평가하려면 GitHub로 로그인해 주세요.

평가는 자동으로 저장소 Discussion에 기록되므로 Discussion 화면을 직접 열 필요가 없습니다. 같은 문제를 다시 평가하면 기존 평가가 갱신됩니다.

DISCUSSION

댓글

GitHub 로그인 후 작성할 수 있으며 모든 댓글은 이 저장소의 Discussions에 보관됩니다.