계단을 오르듯이

백준 [JAVA] 5430. AC 본문

알고리즘/백준_JAVA

백준 [JAVA] 5430. AC

happyAyun 2022. 2. 23. 17:11

비교적 정답률이 낮아 풀고 싶었다.

오.. 역시 낮은 이유는 생각할 조건이 의외로 많았다.

반례를 찾아보고 왜 틀린지를 알았다.

 

아래에 3개의 반례와 주석을 통해 악마의 테케를 피해갈 수 있는 방법을 적어놓았다.

 

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
package algo;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
 
public class B_5430_AC {
 
    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int T = Integer.parseInt(in.readLine());
        for (int i = 0; i < T; i++) {
            String order = in.readLine(); // 명령
            int N = Integer.parseInt(in.readLine());
            String str = in.readLine();
            str = str.substring(1, str.length() - 1); // [] 없애기
            StringTokenizer st = new StringTokenizer(str, ",");
            Deque<Integer> d = new LinkedList<>();
            while (st.hasMoreElements()) {
                d.addLast(Integer.parseInt(st.nextToken()));
            }
 
            boolean isError = false;
            boolean front = true// R에 따른 포커스 방향
            for (int j = 0; j < order.length(); j++) {
                if (d.size() == 0 && order.charAt(j) == 'D') { 
// 아래에 놓으면 안되고 무조건 위에 놓아야 함. -> 아래에 놓으면 연산 후 0이 되면 error를 출력하는 이슈 발생
                    // 또한 d의 사이즈가 0이어도 R의 명령어일 경우 처리가 가능하므로 error가 아니다!! ***
                    sb.append("error\n");
                    isError = true;
                    break;
                }
                if (order.charAt(j) == 'R') {
                    front = !front;
                } else { // D
                    if (front)
                        d.pollFirst();
                    else
                        d.pollLast();
                }
            }
 
            if (!isError) {
                StringBuilder result = new StringBuilder();
                if (front) {
                    while (d.size() > 0) {
                        result.append(d.pollFirst() + ",");
                    }
                    if (result.length() == 0// ** result의 길이가 0인 경우!!! 체크 -> 결과값이 []이고, error가 아님.
                        sb.append("[]\n");
                    else
                        sb.append("[" + result.substring(0, result.length() - 1+ "]" + "\n");
                } else {
                    while (d.size() > 0) {
                        result.append(d.pollLast() + ",");
                    }
                    if (result.length() == 0// ** result의 길이가 0인 경우!!! 체크 -> 결과값이 []이고, error가 아님.
                        sb.append("[]\n");
                    else
                        sb.append("[" + result.substring(0, result.length() - 1+ "]" + "\n");
                }
            }
        }
        System.out.println(sb);
    }
}
 
cs

 

에러의 해결사는 아래의 3개 반례였다!!! 😍

1. error

2. error일 것 같지만, R의 경우에는 error가 되지 않으므로 [] 가 정답

3. 역시 error가 아닌 [] 가 정답이다.

1
DDR
1
[2]

1
DDR
2
[2,1]

1
R
0
[]

'알고리즘 > 백준_JAVA' 카테고리의 다른 글

백준 [JAVA] 2167. 2차원 배열의 합  (0) 2022.03.01
백준[JAVA] 1003. 피보나치함수  (0) 2022.02.24
[JAVA] 11403. 경로 찾기  (0) 2022.02.06
[JAVA] 2638. 치즈  (0) 2022.02.06
[JAVA] 10773. 제로  (0) 2022.02.04