우선 반복 횟수인 N을 입력 받고, 각 반복마다 명령어 + 정수 혹은 명령어 를 입력 받는다.
입력 받은 명령어의 종류는 push pop size empty top 이 있으며 모두 스택 자료구조의 명령어이다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < N; i++) {
String input = br.readLine();
String[] tokens = input.split(" ");
String command = tokens[0];
// push 명령
if (command.equals("push")) {
int temp = Integer.parseInt(tokens[1]);
stack.push(temp);
}
// pop 명령
if (command.equals("pop")) {
if (stack.isEmpty()) {
System.out.println("-1");
} else {
int value = stack.pop();
System.out.println(value);
}
}
// size 명령
if (command.equals("size")) {
int size = stack.size();
System.out.println(size);
}
// empty 명령
if (command.equals("empty")) {
if (stack.isEmpty()) {
System.out.println("1");
} else {
System.out.println("0");
}
}
// top 명령
if (command.equals("top")) {
if (stack.isEmpty()) {
System.out.println("-1");
} else {
int top = stack.peek();
System.out.println(top);
}
}
}
br.close();
}
}
input 변수에 사용자의 입력값을 저장tokens 에 저장 (input 배열에서 값을 공백 단위로 자른 값)tokens 배열의 0번 인덱스를 기준으로 조건문 실행for 루프 N 번의 수행밖에 없으니 O(N) 의 시간복잡도를 갖는다.
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String str = st.nextToken();
int temp = Integer.parseInt(st.nextToken());
N번 동안 반복할 때, 명령어와 정수를 입력받는 부분에서 오류가 발생하였다.
만약, push 3 과 같은 경우에는 명령어는 str, 정수는 temp에 저장이 되지만, pop 과 같이 정수에 대한 입력값이 없을 경우 temp 의 값이 없기에 오류가 생겼다.
해당 오류를 수정하기 위해 BufferedReader 로 입력 받은 값을 공백을 기준으로 토큰을 잘라서 배열에 넣어 저장하도록 했다. 그럼 저장된 배열의 0번 인덱스는 무조건 명령어가 되고 정수가 있을 경우엔 1번 인덱스에 저장되게 된다.
for (int i = 0; i < N; i++) {
String input = br.readLine();
String[] tokens = input.split(" ");
String command = tokens[0];
이후 각 command 에 대한 조건문에 들어갈 때 정수가 필요한 명령어일 경우, tokens 배열의 1번 인덱스에서 정수 값을 꺼내서 사용한다.
반복되는 조건문에서 입력되는 정보가 다양할 때, 토큰을 잘라서 활용하도록 한다.
String input = br.readLine();
String[] tokens = input.split(" ");