21. 백준 10828번 스택

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.

push X: 정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 스택에 들어있는 정수의 개수를 출력한다.
empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

아이디어

arrayList로 스택을 구현한다.

필요한 문법
ArrayList

remove(인덱스), get(인덱스), add(값), size() 메소드
BufferedReader
엔터를 경계로 입력받아 String으로 가져온다. 상대적으로 scanner보다 빠르다.
선언할때 InputStreamReader(System.in) 객체를 생성자의 인수로 가져와서 사용한다.
readLine으로 가져와서 사용한다.
StringTokenizer
문자열과 구분자(선택), true/false(선택)을 인수로 전달하면, 구분자 기준으로 문자열을 쪼개서 나눈다.
true/false는 구분자를 하나의 토큰으로 취급할지, 다른 토큰에 포함시킬지를 결정한다.
Integer.pareInt(~)
문자열과 숫자를 인수로 전달하면, 해당 문자를 숫자에 맞는 진수법에 맞춰 정수화 한다.

코드

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
import java.util.*;
import java.io.*;

public class Main{
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());

var commandCount = Integer.parseInt(st.nextToken());
var stack = new ArrayList<Integer>();

for (int i = 0 ; i < commandCount ; i++){
var tk = new StringTokenizer(bf.readLine());
var command = tk.nextToken();
if(command.equals("push")){
var inputNum = Integer.parseInt(tk.nextToken());
stack.add(inputNum);
} else if(command.equals("pop")){
if (stack.size() != 0){
var output = stack.get(stack.size() - 1);
stack.remove(stack.size()-1);
System.out.println(output);
}
else
System.out.println(-1);

} else if(command.equals("size")){
System.out.println(stack.size());
} else if(command.equals("empty")){
if (stack.size() == 0)
System.out.println(1);
else
System.out.println(0);
} else if(command.equals("top")){
if (stack.size() == 0)
System.out.println(-1);
else
System.out.println(stack.get(stack.size()-1));
}

}
bf.close();
}
}
Share