[백준: 알고리즘_Java] 10828_스택
<문제>
처음엔 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();
}
}
<결과>