정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
1 X
: 정수X
를 스택에 넣는다. (1 ≤ X ≤ 100,000)2
: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면-1
을 대신 출력한다.3
: 스택에 들어있는 정수의 개수를 출력한다.4
: 스택이 비어있으면1
, 아니면0
을 출력한다.5
: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면-1
을 대신 출력한다.
첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)
둘째 줄부터 N개 줄에 명령이 하나씩 주어진다.
출력을 요구하는 명령은 하나 이상 주어진다.
출력을 요구하는 명령이 주어질 때마다 명령의 결과를 한 줄에 하나씩 출력한다.
✅ 처음 봤을 땐 복잡해 보였는데, Stack 클래스의 다양한 메서드를 활용하면 간단하게 해결할 수 있는 문제였다. switch ~ case문을 사용하여 각 명령어 별 수행해야 하는 코드를 작성하였다.
1
: 1번의 경우에만 명령어를 2개 입력받으므로, Stringtokenizer를 사용하여 정수x
를 받아push(x)
메서드를 통해 입력값을stack
에 넣는다. 해당 명령어는 출력을 따로 요구하지 않는다.
2
:empty()
메서드를 활용하여stack
이 비어있지 않은(반환값이false
) 경우에는pop()
메서드를 통해 맨 위의 요소를stack
에서 꺼내면서(삭제) 출력하고, 비어있는 경우에는-1
을 출력한다.
3
:size()
메서드를 통해stack
내의 요소의 개수를 출력한다.
4
: 2번과 동일하게empty()
메서드를 사용하여stack
이 비어있는(반환값이true
) 경우에는1
을, 아닌 경우에는0
을 출력한다.
5
: 2, 4번과 동일하게emtpy()
메서드를 사용하여stack
이 비어있지 않은 경우에는peek()
메서드를 통해 맨 위의 요소를 출력하고, 비어있는 경우에는-1
을 출력한다. 이 때,peek()
은pop()
과 달리 맨 위의 요소를 삭제하지 않고, 단순 출력만 수행한다.
모든 case에서 출력을 수행하므로, 출력값을result
에 저장하여 case문을 빠져 나오면result
를 출력한다. 이 때, 1번은 출력을 수행하지 않으므로result
의 초기값을 어떤 출력값과도 겹치지 않는-2
로 설정해놓고, 1번을 거쳐result
의 값이 그대로-2
인 경우에는 출력을 수행하지 않는다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
Stack<Integer> stack = new Stack<>();
int n = Integer.parseInt(br.readLine());
for(int i=0;i<n;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String order = st.nextToken();
int result = -2;
switch(order) {
case "1" :
int x = Integer.parseInt(st.nextToken());
stack.push(x); break;
case "2" :
if(!stack.empty()) result = stack.pop();
else result = -1;
break;
case "3" :
result = stack.size(); break;
case "4" :
if(stack.empty()) result = 1;
else result = 0;
break;
case "5" :
if(!stack.empty()) result = stack.peek();
else result = -1;
break;
}
if(result != -2) sb.append(result + "\n");
}
bw.write(sb + "");
br.close();
bw.close();
}
}