백준

백준 5430 (Java) AC

석범 2023. 6. 28. 12:55

백준 5430 - Gold 5

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

 

5430번: AC

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

www.acmicpc.net

 

문제

선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다.

AC는 정수 배열에 연산을 하기 위해 만든 언어이다.

이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.

 

함수 R은 배열에 있는 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다.

배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.

 

함수는 조합해서 한 번에 사용할 수 있다.

예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다.

예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 수를 버리는 함수이다.

 

배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오

 

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.

각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다.

p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.

 

다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)

 

다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. (1 ≤ xi ≤ 100)

 

전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.

 

출력

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다.

만약, 에러가 발생한 경우에는 error를 출력한다.

 

입력예제

 

4
RDD
4
[1,2,3,4]
DD
1
[42]
RRD
6
[1,1,2,3,5,8]
D
0
[]

 

출력예제

 

[2,1]
error
[1,2,3,5,8]
error

 

이 문제에서는 reverse라는 뒤집기 기능이 존재한다.

[1,2,3,4]로 되어있는 배열을 뒤집으면 [4,3,2,1]이 되는것이다.

 

값을 넣을 때 반대로 뒤에서 넣거나 앞에서 넣을 때

흔히 사용하는 것이 바로 Deque(덱)이다.

 

덱은 양방향 큐이기 때문에 첫번째 값 혹은 마지막 값을

삽입하거나 삭제할 수 있다.

 

예제에서 나오듯 첫번째 조건은  RDD [1,2,3,4]로 예를 들어보겠다.

 

1 2 3 4

 

R

 

4 3 2 1

 

D

 

3 2 1

 

D

 

2 1

 

위와 같이 진행되는 것을 확인할 수 있다.

 

이 중에서 error가 될 확률은 하나밖에 없다.

삭제하라는 조건이 덱의 크기보다 클 경우이다.

 

그렇기에  dq.size()==0 return "error"를 해주면 된다.

 

이 문제에서는 int형 배열에 편하게 넣을 수 있게 값을 주는 것이 아니라,

[1,2,3,4] 이런식으로 String형태로 데이터를 넣어준다.

그래서 나는 값만 빼내기 위해서는

String.substring()함수와 .split()함수를 활용하였다.

 

쉽게 말하자면 substring()은 필요한 부분을 빼내는 것이고,

split()은 한 단어의 문자열을 통해서 잘라주는 역할을 한다.

 

String s = "Hello,World"라는 문자열이 입력되었을 경우,

String[] str = s.substring(0,s.length()).split(",");

 

idx str
0 Hello
1 World

 

예를 들어서, [1,1,2,3,5,8]을 String형태로 받아왔다고 쳐보자. 

String.substring(1,String.length()-1).split(",");

위처럼 해준다면,

맨 앞의 "["와 맨 뒤의 "]"가 사라진 상태로 배열에 저장될 것이다.

 

그 다음 나는 AC라는 StirngBuilder형 함수를 만들었다.

R이 존재한다면 앞뒤를 뒤집어줘야하기 때문에,

boolean형 reverse라는 변수도 하나 만든 후 진행하였다.

그 다음 조건으로는 D(Delete)가 존재한다.

D가 나왔을 때 사용되는 것이 reverse이다.

만약 reverse = true이면 덱의 가장 뒤에 있는 값을 삭제한다.

그렇지 않다면 가장 앞에 있는 값을 삭제하면 된다.

 

그 이후 StirngBuilder안의 덱의 크기가 0이 될때까지

값을 넣어주면 된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
 
public class Main {
    static StringBuilder sb;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for(int i = 0;i<t;i++) {
            String p = sc.next();
            int n = sc.nextInt();
            String arr = sc.next();
            Deque<Integer> dq = new LinkedList<>();
            for(String s : arr.substring(1, arr.length()-1).split(",")) {
                if(!s.equals("")) {
                    dq.offer(Integer.valueOf(s));
                }
            }
            AC(dq,p);
            System.out.println(sb);
        }
        sc.close();
    }
    static StringBuilder AC(Deque<Integer> dq, String s) {
        sb = new StringBuilder();
        boolean reverse = false;
        for(char c : s.toCharArray()) {
            if(c == 'R') {
                reverse = !reverse;
            }else {
                if(dq.size()==0) {
                    sb.append("error");
                    return sb;
                }
                if(reverse) {
                    dq.removeLast();
                }else {
                    dq.removeFirst();
                }
            }
        }
        sb.append("[");
        while(!dq.isEmpty()) {
            sb.append(reverse ? dq.removeLast() : dq.removeFirst());
            if(dq.size()!=0) {
                sb.append(",");
            }
        }
        sb.append("]");
        return sb;
    }
}
 
cs

 

 

'백준' 카테고리의 다른 글

백준 15989 (Java) 1, 2, 3 더하기 4  (2) 2023.11.15
백준 11279 (Java) 최대 힙  (0) 2023.07.03
백준 10026 (Java) 적록색약  (0) 2023.06.27
백준 1920 (Java) 수 찾기  (0) 2023.06.26
백준 9095 (Java) 1, 2, 3 더하기  (0) 2023.06.26