[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.