알고리즘 공부...공......공

[백준: 알고리즘_Java] 10828_스택

MININI 2021. 12. 24. 00:48

 

 

<문제>

 

 

 

처음엔 Scanner를 이용해서 풀었는데.. 시간초과가 된다고 하여.

BufferedReader/Writer를 사용하기로 하였다.

 

.....하지만 평소에 학교 수업에서는 Scanner를 주로 써왔기에,

Bufferd~이걸 어떻게 사용해야 할 지 모르겠어서 우선 Buffered~를 공부하기로 했다.


(근데 5분정도 공부하다가 깨달은 건데.. 기말고사 시험 범위였구나? 그래서 기억이 남. 그러니 간단히만 적겠음.)

 

 

 

<Buffered~>

 

특징: ENTER단위로 입력받음. String형식으로 고정됨. Scanner 보다 속도 빠름 -> 이 문제에서 버퍼 쓴 이유

       (버퍼 사이즈 지정할 수 있지만, 지정 안 하면 디폴트 사이즈로 알아서 됨)

 

사용법: 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

콘솔창에서 입력 받고 쓰기 위해서는 new InputStreamReader(System.in),new OutputStreamWriter(System.out) 필요

 

(+bw.write()할 때, \n(개행문자) 해야지 줄바뀜.)

!!!그리고 마지막에 콘솔에 bw에 write한 값을 다 출력해 주려면 bw.flush()나 bw.close() 해야함.

 

 

 

<풀이 과정>

 

첫번째 줄에서 버퍼로 명령의 수 int num을 입력 받고, num의 수 만큼 for반복문을 돌려서 한 줄씩 입력받음.

조건문으로 입력받은 문자열에 어떤 명령이 포함되어 있는지 확인 후, 각 명령에 맞게 코드 짬.

 

top, size명령 빼고는 위에 주어진 명령의 이름과 Stack 라이브러리의 메서드 이름이 일치.

-------> top은 Stack의 peek()메서드 이용. 

           size는 따로 메서드가 없는 것 같아서 int size변수를 하나 선언해서 stack에 숫자 추가되면 +1, 삭제되면 -1 함.

 

pop이나 top에서 비어있는 경우 -1을 출력하라고 했는데,

각 메서드의 설명을 보면 비어있는 경우에는 EmptyStackException이 발생한다고 하여..

try-catch문으로 예외처리함.(위의 에러 발생하면 bw.write(-1))

 

나는 Stack라이브러리를 이용했지만.. 나중에 알아보니 배열을 이용하는 방법도 존재함.

 

import java.io.*;
import java.util.EmptyStackException;
import java.util.Stack;
public class Stack_ex {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        Stack<Integer> st = new Stack<>();

        int num = Integer.parseInt(br.readLine()); //명령 개수
        int size = 0; //스택에 들어있는 값의 수

        for(int i = 0; i < num; i++) {
            String input = br.readLine(); //명령 입력받기
            if(input.contains("push")) {
                String[] str = input.split(" ");
                st.push(Integer.parseInt(str[1]));
                size++;
            } else if(input.contains("pop")) {
                try {
                    bw.write(st.pop()+"\n");
                    size--;
                } catch(EmptyStackException e) {
                    bw.write(-1+"\n");
                }
            } else if(input.contains("size")) {
                bw.write(size+"\n");
            } else if(input.contains("empty")) {
                if(st.empty()) {
                    bw.write(1+"\n");
                } else bw.write(0+"\n");
            } else if(input.contains("top")) {
                try {
                    bw.write(st.peek()+"\n");
                } catch (EmptyStackException e){
                    bw.write(-1+"\n");
                }
            }

        }
        bw.flush();
        br.close();
        bw.close();





    }
}

 

<결과>

처음 에러난 건 class이름을 Main으로 안 바꿔서..ㅎㅎ