4. Baek_Joon Algorithm

이재현·2024년 4월 29일
1

Baek_Joon Algorithm

목록 보기
5/6

[Silver IV] 스택 - 10828
문제 링크
스택 - 10828

성능 요약
메모리: 18724 KB, 시간: 228 ms

분류
자료 구조, 구현, 스택

제출 일자
2024년 4월 29일 12:24:25

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

명령은 총 다섯 가지이다.

push X: 정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 스택에 들어있는 정수의 개수를 출력한다.
empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.


예제 입력 .1

14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top

예제 출력 .1

2
2
0
2
1
-1
0
1
-1
0
3

예제 입력 .2

7
pop
top
push 123
top
pop
top
pop

예제 출력 .2

-1
-1
123
123
-1
-1

풀이

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.EmptyStackException;
import java.util.Stack;
import java.util.StringTokenizer;

public class Practice {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력을 받기 위한 BufferedReader 생성
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 출력을 위한 BufferedWriter 생성
        int repeat = Integer.parseInt(br.readLine()); // 명령의 수를 읽어옴
        Stack<Integer> stack = new Stack<>(); // 정수를 저장하기 위한 스택 생성

        for (int i = 0; i < repeat; i++) { // 주어진 명령의 수만큼 반복
            StringTokenizer st = new StringTokenizer(br.readLine()); // 입력된 문자열을 공백으로 나누는 StringTokenizer 생성
            String command = st.nextToken(); // 명령을 읽어옴

            switch (command) { // 명령에 따라 분기 처리
                case "push": 
                    int value = Integer.parseInt(st.nextToken()); // 다음 토큰을 정수로 변환하여 값을 읽어옴
                    stack.push(value); 
                    break;
                case "pop": 
                    try {
                        bw.write(stack.pop() + "\n"); // 스택에서 값을 제거하고 그 값을 출력
                    } catch (EmptyStackException e) { // 스택이 비어 있는 경우
                        bw.write("-1\n"); // -1을 출력
                    }
                    break;
                case "size": 
                    bw.write(stack.size() + "\n"); // 스택의 크기를 출력
                    break;
                case "empty":
                    bw.write((stack.isEmpty() ? 1 : 0) + "\n"); // 스택이 비어 있는지 여부에 따라 1 또는 0을 출력
                    break;
                case "top":
                    try {
                        bw.write(stack.peek() + "\n"); // 스택의 맨 위 값을 출력
                    } catch (EmptyStackException e) { 
                        bw.write("-1\n");
                    }
                    break;
            }
        }

        bw.flush(); // 버퍼에 남아 있는 데이터를 출력
        bw.close(); // 출력 버퍼를 닫음
        br.close(); // 입력 버퍼를 닫음
    }
}
  • 알고리즘 문제 접근 순서
  1. 실버 문제이며, 제한시간이 0.5초 이므로, 속도가 빠른 버퍼 채택
  2. 문자열로 되어있는 값을 공백으로 나눠 스택에 저장
    (Push 1 이라 가정하면, push 와 1의 정수 값을 나눠서 저장 )
  3. try, catch로 스택이 비어 있는데 pop 또는 top을 시도하는 경우에만 예외 처리 후 -1 출력
  4. 그 다음 버퍼를 닫아주고 끝!
profile
뿌에엥

0개의 댓글