[백준_Stack]1874번_스택 수열

Posted by 열정보이
2018. 11. 11. 17:20 Algorithms

스택을 응용한 문제라고 할 수 있는 스택 수열!!



1이상 n이하의 정수가 하나씩 순서대로 입력이 되고, 이렇게 입력되어 생성된 수열(ex 4 3 2 1) 을 1부터 다시 입력된다고 생각할 때, Stack을 이용해 표현할 수 있는지 없는지, 있다면 push를 + , pop을 - 로 출력하여 전체 순서를 출력하고, 없다면 NO를 출력하면 되는 문제!!


바로 코드를 보도록 하자!

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
 
public class Al1874 {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int testCase = Integer.parseInt(br.readLine());
        boolean[] flag = new boolean[testCase + 1];
        Stack<Integer> stack = new Stack<>();
        StringBuilder builder = new StringBuilder();
 
        int[] check = new int[testCase];
        for (int i = 0; i < testCase; i++) {
            check[i] = Integer.parseInt(br.readLine());
        }
 
        stack.push(0);
        for (int i = 0; i < check.length; i++) {
            while (true) {
                int val = stack.peek();
                if (val < check[i]) {
                    if(flag[val+1]) {
                        while (flag[val + 1]) val++;
                    }
                    stack.push(val+1);
                    builder.append("+\n");
                } else if (val > check[i]) {
                    System.out.println("NO");
                    return;
                } else if (val == check[i]) {
                    int temp = stack.pop();
                    builder.append("-\n");
                    flag[temp] = true;
                    break;
                }
            }
        }
        System.out.println(builder.toString());
    }
}
cs


먼저 입력되는 값을 배열로 받아 저장하고, 배열 길이 만큼 for문을 돌리면서 풀면 된다!


만약 stack의 top에 위치한 값이 배열에 저장된 값보다 작다면?

그 값까지 +1 을 해준다!!


만약 같다면?!

pop을 하여, 그 값을 출력하면 된다!!


이때 1 ~ n 까지 모든 숫자는 단 한번만 사용되기 때문에 이미 사용된 숫자인지 아닌지 여부를 확인해야 한다

나는 boolean[] flag 를 선언하여, 방문할 경우 true 값을 주어 확인하였다!


그리고 만약 stack의 top에 위치한 값이 배열에 저장된 구해야 하는 값보다 크다면?

해당 수열은 stack을 이용하여 만들 수 없으므로 "NO"를 출력한다.


왜냐하면 1 ~ n 까지 모든 숫자가 사용되어야 하며, stack의 top 값이 배열의 다음 값보다 클 경우,

stack을 pop하지 않는 이상, 배열의 다음 값을 구할 수 가 없기 때문이다.

그렇다고 pop을 하는 순간 수열의 다른 위치에 있어야 할 값이 출력되는 것이기 때문에 pop을 할 수도 없다.

그렇기 때문에 NO!!


이제는 또 어떤 문제를 풀까~

'Algorithms' 카테고리의 다른 글

[백준_Queue]1966번_프린터 큐  (0) 2018.11.18
[백준_Queue]10845번_큐  (0) 2018.11.13
[백준_Stack]2504번_괄호의 값  (0) 2018.11.06
[백준_Stack]9012번_괄호  (0) 2018.11.04
[백준_Stack]10828번_스택  (0) 2018.11.03