Post

[Baekjoon/Programmers] 10828 스택

10828 스택 문제는 정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하는 문제이다. 스택은 백준 문제를 단계별로 12단계까지 풀고 알고리즘 기초 강의에 수록된 첫번째 문제였는데, 난 java 기본 개념이나 자료 구조에 취약한 편이라 문제를 읽지도 않고 푸는 걸 계속 미뤄왔었다. 스택을 구현하기 위해 어떤 자료구조를 선정해야 하는가부터 막혔는데 우선 제일 간단하게 array로 구현해보기로 했다. 생각보다 금방 코드를 짤 수 있었어서 기분이 좋았었는데 계속 런타임 에러 (ArrayIndexOutOfBounds)가 발생했다. 눈물을 흘리며 질문 게시판도 뒤져보았지만 달라지지 않았고,,, 알고 보니 정말 간단하게 문제를 해결할 수 있었다.

문제에서 명령의 수는 최대 10,000으로 주어지는데, 나는 스택이 비어있는 경우를 top이 0이고, stack[top]=-1 라고 구현해두었기 때문에 10,000번째 값을 push할 때 당연히 배열의 범위를 벗어나게 되는 것이었다…. 배열의 범위를 MAX_ARRAY_SIZE 보다 하나 크게 가지도록 코드를 수정했더니 문제는 바로 해결이 되었다…🤣🥲🤣🥲

이제 맞췄으니 코딩 천재님들의 코드를 보러 가야겠다… 누군가 이걸 보고 계신다면 더 좋은 아이디어나 수정할 점을 마음껏 알려주십쇼…plz

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static class Stack {

        int[] stack;
        int top;
        int MAX_ARRAY_SIZE = 10_000;

        public Stack() {
            this.stack = new int[MAX_ARRAY_SIZE+1];
            this.top = 0;
            stack[top] = -1;
        }

        public void push(int x) {
            top++;
            stack[top] = x;
        }
        public void pop() {
            System.out.println(stack[top]);
            if (top>0) {top--;};
        }
        public void size() {
            System.out.println(top);
        }
        public void empty() {
            System.out.println(top==0? 1:0);
        }

        public void top() {
            System.out.println(stack[top]);
        }
    }


    public static void main(String[] args)  throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack stack = new Stack();

        int num = Integer.parseInt(br.readLine());

        for(int i=0; i<num; i++) {

            StringTokenizer st = new StringTokenizer(br.readLine());
            String cmd = st.nextToken();

            switch (cmd) {
                case "push": cmd.equals("push");
                    int x = Integer.parseInt(st.nextToken());
                    stack.push(x);
                    break;

                case "pop": cmd.equals("pop");
                    stack.pop();
                    break;

                case "size": cmd.equals("size");
                    stack.size();
                    break;

                case "empty": cmd.equals("empty");
                    stack.empty();
                    break;

                case "top": cmd.equals("top");
                    stack.top();
                    break;
            }
        }
    }
}
This post is licensed under CC BY 4.0 by the author.