알고리즘/BOJ (JAVA)

(JAVA) 백준 10828번 : 스택

띵킹 2022. 1. 23. 18:48

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

문제

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

명령은 총 다섯 가지이다.

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

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

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


Stack을 구현하는 문제인데.... 그냥 Stack 클래스를 사용하면 된다. 

알고리즘적으로는 어려움이 없었던 문제

Stack 클래스를 사용 안하면 꽤 어려울 듯.

나중에 자바 숙련도가 늘어나면 기본 배열을 이용해서 다시 풀어볼 필요가 있을 거 같다. 

import java.io.*;
import java.util.*;

public class B_10828 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int N = Integer.parseInt(br.readLine()); //스택 실행 횟수 N 받기
        Stack<Integer> st = new Stack<Integer>();
            for (int i = 0; i < N ; i++) { //N회 반복
                String[] data = br.readLine().split(" "); //입력받은 문자열을 명령어와 정수부로 나누기
                if (data[0].equals("push")) { //명령어와 정수부를 나눠서 stack 매서드 적용
                    st.push(Integer.parseInt(data[1]));                   
                }
                else if (data[0].equals("pop")) {
                    try {
                    bw.write(Integer.toString(st.pop()));
                    bw.newLine();  
                    }
                    catch(Exception e) { //EmptyStack 예외 발생시 문제에서 요구한 -1 출력 실행 (top)도 마찬가지
                        bw.write("-1");
                        bw.newLine();
                    }
                }
                else if (data[0].equals("size")) {
                    bw.write(Integer.toString(st.size()));
                    bw.newLine();
                }
                else if (data[0].equals("empty")) {
                    if (st.empty()) {
                        bw.write("1");
                        bw.newLine();
                    }
                    else {
                        bw.write("0");
                        bw.newLine();
                    }
                }
                else if (data[0].equals("top")) {
                    try {
                    bw.write(Integer.toString(st.peek()));
                    bw.newLine();
                    }
                    catch (Exception e)
                    {
                        bw.write("-1");
                        bw.newLine();
                    }
                }
            }
            bw.flush();
            bw.close();      
    }  
}

처음에 peek에서의 예외를 생각 안하고 넣어서 틀림. 급하게 peek에도 예외처리를 했는데 생각해보니 포문 전체에 처리를 했다면 중복된 코드를 줄일 수 있었을 것 같다.&amp;nbsp;

 

728x90