[백준] 5430 - AC

2020. 11. 17. 10:52알고리즘/Baekjoon

백준 바로가기

 

5430번: AC

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

www.acmicpc.net

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

풀다가 시간이 모자라 다른 분의 풀이를 보고 해석한 문제입니다. 많이 어렵진 않은 문제라 설명이 짧습니다.

1. 배열생성

  • 앞, 뒤에서 문자 뽑는 함수가 있으므로 Deque 사용
  • Deque = Double End Queue
  • 빈 배열일 때 D(Delete)될 수 없기 때문에 error 처리
  • StringTokenizer로 입력받은 배열을 Deque에 저장

2. 함수 실행

  • R일 경우 boolean r을 false로 바꿈
  • D일 경우 r이 false면 pollLast(맨 뒤 index 뺌), true면 pollFist(맨 앞 index 뺌)
  • D일 경우 Deque 사이즈가 0이면 errorFlag를 true로 바꾸고 반복문 종료

3. 남은 수 출력

  • r이 true일 경우 반대로 출력(pollLast 반복), false일 경우 정상 출력(pollFist)

4. 코드

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    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");
            }
        }
    }
cs