알고리즘 풀이/백준

[백준][Java] 5430번 AC

배게 2021. 7. 17. 21:01
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)==-1return "error";
        else if(input.size()==0return "[]";
        
        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