[백준] 1874 - 스택 수열

2020. 11. 6. 08:53알고리즘/Baekjoon

백준 바로가기

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

https://www.acmicpc.net/problem/1874

스택을 활용해 정해진 수열을 만드는 문제입니다. 바로 이해가 되지 않았던 문제인데, 숫자 n이 주어지면 1~n까지 숫자들을 오름차순으로 정렬된 스택에 저장하면서 push와 pop으로 주어진 수열을 반환해주면 됩니다. 

저는 for문으로 접근했다가 중첩 시 조건에 맞추기가 어려워 못풀었습니다. 풀이를 보니 반복 조건을 넣을 수 있는 while문을 사용해야 되더군요. 또한 반복하는 조건도 push 하면서 수열의 i번째 숫자와 1~n까지 숫자에 포함된 i가 같을 경우 while문에 들어가 pop되며 반복문을 실행하고 만족시키지 않으면 나와서 push를 진행하는 로직이어서 생각해야할 부분이 있는 문제였던것 같습니다.

for문 안에 while문을 사용하고, 반복문 조건을 스택에 push한 숫자와 주어진 수열을 비교했을 때 같을 경우로 설정하고 pop한 다음에도 조건을 만족한다면 계속 while문을 반복한다는 점은 기억해뒀다가 다음에도 활용해야겠습니다.

아래는 코드이며, 간단한 문제였기 때문에 더 자세한 설명은 생략하겠습니다.

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
public class StackArray_1874 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
 
        int testcaseNum;
        int[] inputElements;
        int k = 0;
        Stack<Integer> stack = new Stack<>();
 
        testcaseNum = sc.nextInt();
        inputElements = new int[testcaseNum];
 
        for (int i = 0; i < testcaseNum; i++) {
            inputElements[i] = sc.nextInt();
        }
 
        for (int i = 1; i <= testcaseNum; i++) {
            stack.push(i);
            sb.append("+" + "\n");
            while (!stack.isEmpty() && stack.peek() == inputElements[k]) {
                stack.pop();
                sb.append("-" + "\n");
                k++;
            }
        }
        if (!stack.isEmpty()) {
            System.out.println("NO");
        } else {
            System.out.println(sb);
        }
    }
}
cs

'알고리즘 > Baekjoon' 카테고리의 다른 글

[백준] 11279 - 최대 힙  (0) 2020.12.07
[백준] 5430 - AC  (0) 2020.11.17
[백준] 11047 - 동전 0  (0) 2020.10.21
[백준] 11054 - 가장 긴 바이토닉 부분 수열  (0) 2020.10.20
[백준] 12865 - 평범한 배낭  (0) 2020.10.16