https://www.acmicpc.net/problem/5430
[문제]
[풀이]
주어진 배열과 명령을 가지고 결과값을 출력 해내는 문제이다.
n의 합이 70만개 이므로 R 연산이 들어올 때 마다 reverse 연산을 시행하면 시간초과가 발생한다.
reverse 연산을 마지막에 출력할 때만 하기위해 R연산이 들어오면 뒤집는 대신 , direction 이라는 방향상태를 나타내는 상태 변수 하나를 정해두고 양 방향에서 접근할 수 있게 list 대신 deque를 사용한다.
이번엔 뭔가 더 객체지향스럽게 풀어내기위해 ArrayDeque를 상속받는 새로운 클래스를 만들고 필요한 메서드들을 재정의 하거나 만들었다.
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
import java.util.*;
import java.io.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int tc = Integer.parseInt(br.readLine());
// 테스트 케이스
while (tc-->0){
//명령어 집합
String[] commands = br.readLine().split("");
// 원소들 수
int size = Integer.parseInt(br.readLine());
// 배열 추출
DirectDeque<Integer> deque = getList(br);
// 명령 수 만큼 순회
for (String command : commands) {
// 만약 덱에 에러가 발생했다면
if(deque.isError) break;
deque.executeCommand(command);
}
System.out.println(deque.toString());
}
}
private static DirectDeque<Integer> getList(BufferedReader br) throws IOException {
return Arrays.stream(br.readLine().replaceAll("\\D", " ").split(" "))
.filter(e -> !e.equals("")).mapToInt(Integer::parseInt)
.boxed().collect(Collectors.toCollection(DirectDeque::new));
}
static class DirectDeque<Integer> extends ArrayDeque<Integer>{
private int direction =1;
private boolean isError=false;
@Override
public String toString() {
if(isError) return "error";
if(this.direction==-1){
// 역 방향일때
ArrayList<Integer> reverseList= new ArrayList<>(this);
Collections.reverse(reverseList);
return reverseList.toString().replaceAll(" ","");
}
else // 정뱡향일때
return new ArrayList<>(this).toString().replaceAll(" ","");
}
private void reverse(){
direction = direction*-1;
}
private void delete(){
if(direction==1) this.removeFirst();
else this.removeLast();
}
public void executeCommand(String command){
// 명령 수행
if(command.equals("D") && this.isEmpty()) { // 에러를 포함한다면 에러 상태 바꾼 후 종료
this.isError = true;
return;
}
if(command.equals("D")) this.delete();
else this.reverse();
}
}
}
|
cs |
'알고리즘,PS > 백준' 카테고리의 다른 글
[BOJ] 백준 [14442] 벽 부수고 이동하기 2JAVA (0) | 2022.03.09 |
---|---|
[BOJ] 백준 [3109] 빵집 JAVA (0) | 2022.03.07 |
[BOJ] 백준 [2580] 스도쿠 JAVA (0) | 2021.12.05 |
[BOJ] 백준 [1826] 연료채우기 JAVA (0) | 2021.12.03 |
[BOJ] 백준 [2152] 여행계획세우기 JAVA (0) | 2021.12.01 |