💡 문제
💬 입출력 예시
📌 풀이(소스코드)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N, idx;
static int[] stack = new int[10001];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(br.readLine());
idx = -1;
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String cmd = st.nextToken();
if (cmd.equals("push")) {
push(Integer.parseInt(st.nextToken()));
} else if (cmd.equals("pop")) {
sb.append(pop()).append("\n");
} else if (cmd.equals("size")) {
sb.append(size()).append("\n");
} else if (cmd.equals("empty")) {
sb.append(empty()).append("\n");
} else if (cmd.equals("top")) {
sb.append(top()).append("\n");
}
}
System.out.println(sb);
}
private static void push(int x) {
stack[++idx] = x;
}
private static int pop() {
if (size() == 0) {
return -1;
}
return stack[idx--];
}
private static int size() {
return idx + 1;
}
private static int empty() {
if (size() == 0) {
return 1;
}
return 0;
}
private static int top() {
if (size() == 0) {
return -1;
}
return stack[idx];
}
}
📄 해설
접근
- 정수형 스택과 그 연산들을 구현하는 문제. 정수형 배열을 사용해서 구현해봤다.
- 스택의 연산들은 전부 메소드로 작성. 스택의 기본 개념을 알고 Java 의 배열 사용법을 알고 있다면 충분히 쉽게 풀이 가능하다.
- 정수 배열로 스택을 처음 구현한다면 인덱스를 다루는 부분이 조금 헷갈릴 수 있으나, 스택의 개념을 안다면 금방 이해할 것이다.
과정
N
을 입력 받고, 스택의 top 인덱스 가리킬 idx
는 -1 로 초기화. 0으로 초기화해도 상관은 없으나, 메소드들에서의 연산을 본 풀이와 다르게 해야한다.
N
개의 명령어를 입력 받고 각각에 맞는 메소드를 호출하면 main
메소드 부분은 완료된다. 출력을 하는 명령어의 경우는 StringBuilder
에 append
하여 출력문을 만들어준다.
- 아래는 각 메소드들에 대한 설명
push(int x)
: 스택에 x
를 추가한다. 이때, idx
를 -1 로 초기화 했으므로 ++idx
를 통해 ArrayIndexOutOfBoundsException
예외를 피해줘야한다.
size()
: 스택 탑의 인덱스 번호 + 1 이어야 하므로, idx + 1
을 반환한다. pop()
, empty()
, top()
메소드에서 스택이 비어있는지 여부를 확인하는 메소드
pop()
: 스택이 비어있으면 -1 을 반환하고, 그렇지 않으면 idx--
를 통해 먼저 출력하고 idx
를 감소시켜줘야한다. 이유는 push 메소드와 동일
empty()
: 스택이 비어있으면 1 을 반환하고, 그렇지 않으면 0 을 반환한다.
top()
: 스택이 비어있으면 -1 을 반환하고, 그렇지 않으면 stack[idx]
를 반환한다.