[Java] 백준(실버-4) 10828번 - 스택

자세한 입출력 테스트케이스는 문제 링크를 참고하자.
문제 풀이
이 문제는 스택의 각종 기능을 활용해 스택에 데이터를 삽입 및 추출하면 된다.
복잡한 로직 없이 순수한 스택의 기능만으로 쉽게 구현이 가능하다.
아이디어 도출
- 주어지는 명령어대로 스택을 처리하면 된다.
- 명령어에 “push” 문자열이 있다면 “push [num]”의 num 값을 스택에 삽입한다. 이 때 별도로 출력할 필요는 없다.
- “pop”이라면 스택에서 pop연산을 하여 삭제된 값을 출력한다. 이 때 스택이 비어있는지 확인 후 비어있다면 -1을 출력한다.
- “size”라면 스택의 존재하는 값 개수를 출력한다.
- “empty”라면 스택이 비어있는지 확인하여 비어있다면 1, 비어있지 않다면 0을 출력한다.
- “top”라면 스택의 맨 위 값을 출력한다. 이 때 스택이 비어있는지 확인 후 비어있다면 -1을 출력한다.
명령어대로 스택을 조작하여 값을 출력하면 된다. 바로 코드를 작성해보자.
1
2
int N = Integer.parseInt(br.readLine());
Stack<Integer> st = new Stack<>();
명령어 갯수 N을 입력받고 스택을 하나 생성하자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
for(int i=0; i<N; i++) {
String cmd = br.readLine();
if(cmd.contains("push")) { // 1
int num = Integer.parseInt(cmd.split(" ")[1]);
st.push(num);
}
else {
switch(cmd) {
case "pop": // 2
if(st.empty()) bw.write("-1"+"\n");
else bw.write(st.pop()+"\n");
break;
case "top": // 3
if(st.empty()) bw.write("-1"+"\n");
else bw.write(st.peek()+"\n");
break;
case "size": // 4
bw.write(st.size()+"\n");
break;
case "empty": // 5
if(st.empty()) bw.write("1"+"\n");
else bw.write("0"+"\n");
break;
default:
break;
}
}
}
주어지는 명령어를 cmd라 하고 cmd 명령어에 따라 연산하여 결과를 출력하면 된다.
- push [num] 일 때는 cmd에 “push” 문자열이 있는지 확인하여 num값을 스택에 삽입한다.
- pop일 때는 스택이 비어있는지 확인 후 pop 연산을 하여 삭제된 값을 출력한다.
- top일 때는 peek() 메서드를 활용하여 스택의 맨 위 값을 출력한다. 역시나 스택이 비어있다면 -1을 출력하면 된다.
- size일 때는 스택의 값 개수를 출력하면 된다.
- empty일 때는 값 유무에 따라 비어있다면 1, 비어있지 않다면 0을 출력하면 된다.
작성코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.io.*;
import java.util.*;
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));
int N = Integer.parseInt(br.readLine());
Stack<Integer> st = new Stack<>();
for(int i=0; i<N; i++) {
String cmd = br.readLine();
if(cmd.contains("push")) {
int num = Integer.parseInt(cmd.split(" ")[1]);
st.push(num);
}
else {
switch(cmd) {
case "pop":
if(st.empty()) bw.write("-1"+"\n");
else bw.write(st.pop()+"\n");
break;
case "top":
if(st.empty()) bw.write("-1"+"\n");
else bw.write(st.peek()+"\n");
break;
case "size":
bw.write(st.size()+"\n");
break;
case "empty":
if(st.empty()) bw.write("1"+"\n");
else bw.write("0"+"\n");
break;
default:
break;
}
}
}
bw.flush();
bw.close();
br.close();
}
}
회고
- 스택에서 제공하는 각종 기능들을 활용해 복잡한 알고리즘 없이 순수한 스택을 활용하여 문제를 풀 수 있었다.