728x90
처음에는 Arrays.sort([array], Collections.ReverseOrder()) 이거로
Reverse하고 Delete하고 Reverse하고.. 이런 식으로 하는 건줄 알았는데
element의 양이 많고 삭제가 빈번하다는 점에서 LinkedList를 사용해야하는 것을 깨달았음
(바로 LinkedList를 써야겠군 이정도도 안되는 수준임 지금)
각 TestCase마다 결과 String을 출력할 수 있도록
부분적인 기능을 하는 함수들을 만듬
1. String을 Parsing해서 숫자를 추출해 LinkedList를 return하는 함수
2. 1번에서 return받은 LinkedList를 명령어(ex)"RDD", "DD", "RRD")에 맞게 LinkedList 양끝단을 잘라내는 함수
※ 2번 함수에서 LinkedList의 element가 존재하지 않을 때 D(Delete)명령어를 수행할 경우
입력으로 절대 주어질 수 없는 원소인 '-1' 하나를 넣어주고 LinkedList를 return해줌
3. 2번에서 return받은 LinkedList의 size가 1이고, 그 하나의 element가 '-1'일 경우 "error"를 return
error가 아닌 경우 LinkedList의 element를 빼와서 StringBuilder로 결과값 만들어줌
4. 1~3번 함수을 사용하여 finalResult를 return해주는 함수
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
public class Main {
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static LinkedList<Integer> stringToList(String input) {
String str;
if(input.length()>2) {
str = input.substring(1,input.length()-1);
}
else return new LinkedList<>();
String[] strArr = str.split(",");
LinkedList<Integer> numLinkedList = new LinkedList<>();
for (String string : strArr) {
numLinkedList.add(Integer.parseInt(string));
}
// int[] nums = Arrays.stream(strArr).mapToInt(Integer::parseInt).toArray();
return numLinkedList;
}
static LinkedList<Integer> reverseAndDelete(LinkedList<Integer> input, String p) {
boolean reverse=false;
for(int i=0; i<p.length(); i++) {
if(p.charAt(i)=='R') {
reverse=!reverse;
}
else if(p.charAt(i)=='D') {
if(input.size()>0) {
if(!reverse) input.removeFirst();
else input.removeLast();
}
else {
// return "error"
input.add(-1);
return input;
}
}
}
if(reverse) {
LinkedList<Integer> inputReverse = new LinkedList<>();
while(!input.isEmpty()) {
inputReverse.add(input.removeLast());
}
return inputReverse;
}
return input;
}
static String resultString (LinkedList<Integer> input) {
if(input.size()==1 && input.get(0)==-1) return "error";
else if(input.size()==0) return "[]";
StringBuilder sb = new StringBuilder();
while(!input.isEmpty()) {
sb.append(String.valueOf(input.remove(0))).append(",");
}
sb.deleteCharAt(sb.length()-1);
return "["+ new String(sb) +"]";
}
static String finalResult(String input, String p) {
return resultString(reverseAndDelete(stringToList(input), p));
}
public static void main(String[] args) throws IOException{
int T = Integer.parseInt(br.readLine());
for(int i=0; i<T; i++) {
String p = br.readLine(); // 함수집합 ex)"RDD"
int N = Integer.parseInt(br.readLine());
String input = br.readLine(); // ex)[1,1,2,3,5,8]
// 위에 string을 어떻게 정수 배열로 뽑을 것인가? (정수배열X )
// Reverse, Delete함수 만들기 (수행시간에서 컷 안되게 만들기)
// 배열이 없을 때 Reverse를 하면? 배열이 없을 때 Delete를 하면 error가 나는데
// 정수 배열을 어떻게 string으로 만들 것인가?
System.out.println(finalResult(input, p));
}
}
}
|
cs |
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준][Java] 4949번 균형잡힌 세상 (String, stack) (0) | 2021.09.08 |
---|---|
[백준][Java] 11404번 플로이드 (플로이드 와샬, DP) (0) | 2021.09.08 |
[백준][Java] 10773번 제로 (0) | 2021.07.17 |
[백준][Java] 2606번 바이러스 (0) | 2021.07.17 |
[백준][Java] 1181번 단어 정렬 (0) | 2021.06.27 |