백준 - 5430번 AC (골드 5)

2024. 3. 14. 10:10코딩테스트 정리(자바)

728x90

1. 직접 뒤집어야 하나 생각했다.

그러나 그럴 필요가 없었다.

flag로 앞에서 뺄지 뒤에서 뺄지만 정하면 됨.

 

2.대괄호와 콤마를 제외하고 숫자만 남기기

-> 여러방법이 있겠지만 replaceAll() 을 사용했다

-> 숫자 또는 콤마를 ""으로 교체.

정규식을 쓸 때 대괄호를 중첩해서 쓰면 '또는' 가능

String s=br.readLine().replaceAll("[^0-9[,]]","")

* substring()으로 하는 방법도 있음

String s=br.readLine();
String[] number=s1.substring(1,s1.length()-1).split(",");

 

 

 

실패

: error를 출력하고 while문의 처음으로 돌아가고 싶은데 방법을 못찾았다.

-> 결국 따로 떼어내어 메소드를 만들기로 함.

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

        class Main {
            public static void main(String[] args) throws IOException {
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(System.in));
                BufferedWriter bw = new BufferedWriter(
                        new OutputStreamWriter(System.out));
                Deque<String> deq = new LinkedList<>();

                int T = Integer.parseInt(br.readLine());
                boolean flag = true; //true면 앞에서부터 제거하고 false면 뒤에서부터 제거

                while (T-- > 0) {
                    String[] str = br.readLine().split(""); //명령 담을 배열

                    int n = Integer.parseInt(br.readLine()); //deq에 들어갈 숫자 개수

                    String s = br.readLine().replaceAll("[^0-9[,]]",""); //숫자만 남기고 다른 문자 제거
                    //[a-d[m-p]] : a 부터 d까지, 또는 m 부터 p까지 중에 하나와 일치합니다

                    String[] number = s.split(","); //콤마 기준으로 숫자들 구분


                    for (int i = 0; i < n; i++) { //숫자 덱에 담기
                        deq.add(number[i]);
                    }
                    flag=true; //flag 초기화
                    for (int i = 0; i < str.length; i++) {
                        if (str[i].equals("R")) //R이면 flag 바꾸기
                            flag = !flag;
                        else if (str[i].equals("D")) {//D이면 deq에서 숫자 제거
                            if (!deq.isEmpty()) {
                                if (flag) //앞에서부터 제거
                                    deq.removeFirst();
                                else //뒤에서부터 제거
                                    deq.removeLast();
                            } else {
                                bw.write("error\n");
                                break;
                            }
                        }

                    }
                    if(!deq.isEmpty()){
                        bw.write("[");
                        if(flag) {//앞에서부터 출력
                            while(deq.size()>1)
                                bw.write(deq.removeFirst()+",");
                            bw.write(deq.removeFirst());
                            bw.write("]\n");
                        }
                        else {//뒤에서부터 출력
                            while(deq.size()>1)
                                bw.write(deq.removeLast()+",");
                            bw.write(deq.removeLast());
                            bw.write("]\n");
                        }

                    }
                }
                bw.flush();
                bw.close();
            }
        }

 


 

계속 실패해서 왜 그런가 찾아봤더니

빈 덱인 경우 [ ] 이렇게 출력을 해야 한다고 한다. 

 

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

        class Main {
            static void AC(Deque <String> deq,String[] str,StringBuilder sb){

                boolean flag = true; //flag 초기화
                int size=str.length;
                for (int i = 0; i < size; i++) {
                    if (str[i].equals("R")) //R이면 flag 바꾸기
                        flag = !flag;

                    else if (str[i].equals("D")) {//D이면 deq에서 숫자 제거
                        if (!deq.isEmpty()) {
                            if (flag) //앞에서부터 제거
                                deq.removeFirst();
                            else //뒤에서부터 제거
                                deq.removeLast();
                        } else {
                            sb.append("error\n");
                            return;
                        }
                    }

                }
                sb.append("[");
                if(!deq.isEmpty()){
                    if(flag) {//앞에서부터 출력
                        while(deq.size()>1)
                            sb.append(deq.removeFirst()).append(",");

                        sb.append(deq.removeFirst());
                    }
                    else {//뒤에서부터 출력
                        while(deq.size()>1)
                            sb.append(deq.removeLast()).append(",");
                        sb.append(deq.removeLast());
                    }
                }
                sb.append("]\n");

            }
            public static void main(String[] args) throws IOException {
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(System.in));
                BufferedWriter bw = new BufferedWriter(
                        new OutputStreamWriter(System.out));
                Deque<String> deq = new LinkedList<>();

                int T = Integer.parseInt(br.readLine());
                StringBuilder sb = new StringBuilder();

                while (T-- > 0) {
                    String[] str = br.readLine().split(""); //명령 담을 배열

                    int n = Integer.parseInt(br.readLine()); //deq에 들어갈 숫자 개수

                    String s = br.readLine().replaceAll("[^0-9[,]]",""); //숫자만 남기고 다른 문자 제거

                    String[] number = s.split(","); //콤마 기준으로 숫자들 구분



                    for (int i = 0; i < n; i++) { //숫자 덱에 담기
                        deq.add(number[i]);
                    }

                    AC(deq,str,sb);

                }
                bw.write(sb.toString());
                bw.flush();
                bw.close();
            }
        }

 


 

*** 찾아보니 레이블로 continue 하는 방법이 있었음

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

        class Main {
            static void AC(Deque <String> deq,String[] str,StringBuilder sb){


            }
            public static void main(String[] args) throws IOException {
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(System.in));
                BufferedWriter bw = new BufferedWriter(
                        new OutputStreamWriter(System.out));
                Deque<String> deq = new LinkedList<>();

                int T = Integer.parseInt(br.readLine());
                StringBuilder sb = new StringBuilder();

               Loop: while (T-- > 0) {
                    String[] str = br.readLine().split(""); //명령 담을 배열

                    int n = Integer.parseInt(br.readLine()); //deq에 들어갈 숫자 개수

                    String s = br.readLine().replaceAll("[^0-9[,]]",""); //숫자만 남기고 다른 문자 제거

                    String[] number = s.split(","); //콤마 기준으로 숫자들 구분



                    for (int i = 0; i < n; i++) { //숫자 덱에 담기
                        deq.add(number[i]);
                    }

                    boolean flag = true; //flag 초기화
                    int size=str.length;
                    for (int i = 0; i < size; i++) {
                        if (str[i].equals("R")) //R이면 flag 바꾸기
                            flag = !flag;

                        else  {//D이면 deq에서 숫자 제거
                            if (!deq.isEmpty()) {
                                if (flag) //앞에서부터 제거
                                    deq.removeFirst();
                                else //뒤에서부터 제거
                                    deq.removeLast();
                            } else {
                                sb.append("error\n");
                                continue Loop;
                            }
                        }

                    }
                    sb.append("[");
                    if(!deq.isEmpty()){
                        if(flag) {//앞에서부터 출력
                            while(deq.size()>1)
                                sb.append(deq.removeFirst()).append(",");

                            sb.append(deq.removeFirst());
                        }
                        else {//뒤에서부터 출력
                            while(deq.size()>1)
                                sb.append(deq.removeLast()).append(",");
                            sb.append(deq.removeLast());
                        }
                    }
                    sb.append("]\n");


                }
                bw.write(sb.toString());
                bw.flush();
                bw.close();
            }
        }
728x90