백준 온라인 저지/Gold

[BOJ] 5430 - AC

jooona 2022. 2. 9. 17:23
반응형

개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.

 

문제

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

 

5430번: AC

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

www.acmicpc.net

난이도: 골드 5

사용언어: JAVA

 

풀이

우선 문제 자체는 덱을 사용하면 쉽게 풀 수 있습니다. 

 

덱은 큐의 발전된 형태로, 양쪽 끝 모두로 입, 출력을 할 수 있는 자료구조입니다. 편의상 덱의 앞쪽 출입구를 머리 부분, 뒤쪽 출입구를 꼬리 부분이라고 하겠습니다.

 

덱은 다음과 같이 선언하여 사용할 수 있습니다.

 

Deque<Object> dq_name = new ArrayDeque<>();

 

덱의 주요 함수는 다음과 같습니다.

 

addFrist(): 덱의 꼬리 부분으로 삽입합니다.

addLast(): 덱의 머리 부분으로 삽입합니다.

pollFirst(): 덱의 머리 부분에서 하나를 삭제합니다.

pollLast(): 덱의 꼬리 부분에서 하나를 삭제합니다.

size(): 덱의 크기를 반환합니다.

isEmpty(): 덱이 비었는지 여부를 반환합니다.

 

 

문제 풀이는 다음과 같습니다.

 

명령어 R: 배열을 뒤집는 대신 덱의 머리를 어디로 둘 지만 바꿔주면 됩니다.

명령어 D: 배열의 머리 부분에서 숫자 하나를 빼줍니다.

 

덱을 사용할 줄 안다면 문제 자체는 어렵지 않지만 배열의 입력을 받는 것이 귀찮습니다.

 

저는 입력을 [1,2,3,4,5]로 받으면

 

1. 우선 substring 함수를 이용해 앞 뒤의 '['와 ']'를 없애준다.

2. split 함수를 이용해 ','를 없애고 String 배열에 숫자들을 담아준다.

 

위의 두 단계를 통해 덱에 숫자를 차례로 입력해 주었습니다.

 

다음은 제가 작성한 코드입니다.

 

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
import java.io.*;
import java.util.*;
 
public class Main {
 
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static int T;
 
    public static void main(String[] args) throws IOException {
 
        T = Integer.parseInt(br.readLine());
        Deque<Integer> dq = new ArrayDeque<>();
 
        for (int test_case = 0; test_case < T; test_case++) {
            String input = br.readLine();
            int N = Integer.parseInt(br.readLine());
            String s = br.readLine();
            s = s.substring(1, s.length() - 1); // '[', ']' 제거
            String[] str = s.split(","); // ',' 제거
 
            for (int i = 0; i < N; i++) {
                dq.addLast(Integer.parseInt(str[i]));
            }
            int front = 0// 덱의 어느 방향을 머리 부분으로 정할 것인가.
            for (int i = 0; i < input.length(); i++) {
                if (input.charAt(i) == 'D') {
                    if (dq.isEmpty()) { // 덱이 비었다면
                        bw.write("error\n"); // 에러 출력
                        front = -1;
                        break;
                    }
                    if (front == 0) { // front가 0이면 앞쪽에서 제거
                        dq.pollFirst();
                    } else { // 1이면 뒷쪽에서 제거
                        dq.pollLast();
                    }
                } else if (input.charAt(i) == 'R') {
                    front = front == 1 ? 0 : 1// front가 0이면 1로, 1이면 0으로 지정
                }
            }
            if (front == -1) { // 덱이 비어서 에러를 출력했다면 실행하지 x
 
            } else { // 남은 배열 출력
                bw.write("[");
                if (front == 1) {
                    while (dq.size() > 1) {
                        bw.write(String.valueOf(dq.pollLast()) + ",");
                    }
                } else if (front == 0) {
                    while (dq.size() > 1) {
                        bw.write(String.valueOf(dq.pollFirst()) + ",");
                    }
                }
                if (dq.size() > 0)
                    bw.write(String.valueOf(dq.pollFirst()));
                bw.write("]\n");
            }
            dq.clear();
        }
        bw.flush();
        bw.close();
        br.close();
    }
}
 
 
cs

 

 

반응형

'백준 온라인 저지 > Gold' 카테고리의 다른 글

[BOJ] 2412 - 암벽 등반  (0) 2022.07.31
[BOJ] 16437 - 양 구출 작전  (0) 2022.07.30
[BOJ] 3078 - 좋은 친구  (0) 2022.02.03
[BOJ] 2116 - 주사위 쌓기  (0) 2022.01.31
[BOJ] 10423 - 전기가 부족해  (2) 2021.10.21