[백준] 28278. 스택 2

진예·2023년 10월 30일
0

Baekjoon : JAVA

목록 보기
50/76
post-thumbnail
post-custom-banner

📌 문제

[28278] 스택 2

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

명령은 총 다섯 가지이다.

  • 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();
	}
}

profile
백엔드 개발자👩🏻‍💻가 되고 싶다
post-custom-banner

0개의 댓글