알고리즘/백준 알고리즘

[java] 백준 알고리즘 1874번 스택 수열 풀이

희랍인 조르바 2018. 7. 11. 16:52



사용하는 객체가 많아 메모리, 시간 둘 다 많이 잡아먹는다. ㅠㅠ


내가 짰지만 소스가 그다지 마음에 들지는 않지만, 일단 문제 해결.



* 풀이 소스


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
 
public class Baekjooon1874{
 
    static StringTokenizer st;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        st = new StringTokenizer(br.readLine());
        int rangeNum = Integer.parseInt(st.nextToken()); // 몇개의 수열이냐
        int[] matchingArray = new int[rangeNum+1]; // 입력된 수열(만들고 싶은 or 원하는 수열)
        int[] reOrderArray = new int[rangeNum+1]; // push와 pop의 반복으로 만들어진(재정렬된) 배열
        
        Stack<Integer> stackImpl = new Stack<>(); // 구현된 스택
        List<String> pushPopList = new ArrayList<>(); // +,-로 나타낼 리스트
        
        for(int i=1; i<matchingArray.length; i++) {
            st = new StringTokenizer(br.readLine());
            matchingArray[i] = Integer.parseInt(st.nextToken());
        }
        
        int order = 1
        for(int j=1; j<=rangeNum; j++) { // 문제의 n까지 수열 반복
            
            stackImpl.push(j);
            pushPopList.add("+"); // push가 이루어지면 + 입력
            if(matchingArray[order] == j) { // 만들고싶은 수가 나오는 순간 pop
                int popNum = j;
                
                while(matchingArray[order] == popNum) { // 한 번 pop되고 바로 다음 원하는 값이 있을 경우 계속 반복
                    
                    reOrderArray[order] = stackImpl.pop();
                    
                    order++// 단순히 재정렬하는 배열을 만들기 위해 index 객체
                    pushPopList.add("-");
                    if(stackImpl.size()>0) {
                        popNum = stackImpl.get(stackImpl.size()-1);
                    }else {
                        break;
                    }
                    
                    if(order == matchingArray.length) { // 만들고자 하는 배열의 길이를 넘는 순간 더 이상 비교할 필요 없으므로 break
                        break;
                    }
                }
            }
        }
        
        while(!stackImpl.isEmpty()) { // 스택에 값이 남아있다면 나머지는 다 pop(-)을 해줘야하니까 계산
            reOrderArray[order] = stackImpl.pop();
            order++;
            pushPopList.add("-");
        }
        
        if(Arrays.equals(matchingArray, reOrderArray)) { // 새로 만든 배열과 만들고자하는 배열이 일치하면 프린트
            for(String output : pushPopList) {
                bw.write(output);
                bw.newLine();
                bw.flush();
            }
        }else { // 일치하지 않는다면 불가
            bw.write("NO");
            bw.flush();
        }
    }
 
}
 
cs