개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.
문제
https://www.acmicpc.net/problem/5430
난이도: 골드 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 |