이 문제는 스택의 특성을 먼저 알아야 한다. 스택은 다양한 자료구조 중 하나이며, 큐(queue)와 대응되는 자료구조이다. 스택(stack)은 마치 상자를 쌓고 빼고를 반복할 수 있는 구조이다 어떤 물건들을 쌓고 빼낼 때는 다시 위에서부터 차례대로 빼야한다. 이것이 바로 스택의 원리이다. 즉, Last In, First Out (LIFO) 나중에 들어온 것을 제일 먼저 꺼내는 방법이다.
스택에 대한 설명은 이정도로 해두겠다. (조만간 스택과 큐에 대해 자세하게 다루는 내용을 만들어 포스팅해 보겠다.)
필자는 이 문제를 풀기 위해 ArrayList를 사용하였으며 문제에서 제시한 명령 다섯가지를 메소드로 만들어 사용하였다.
(보통 큐와 스택을 적용할 때 ArrayList를 사용한다.)
package baekjoon;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
class Stack{
ArrayList<Integer> stack = new ArrayList<Integer>();
public void push(int x) {
stack.add(x);
}
public int pop() {
if(stack.isEmpty()) {
return -1;
}
else{
return stack.remove(stack.size()-1); //마지막 값을 제거하고 그 값을 리턴
}
}
public int size() {
return stack.size();
}
public int empty() {
return (stack.isEmpty())? 1 : 0; //스택이 비어있으면 1, 아니면 0을 리턴
}
public int top() {
if(stack.isEmpty()) {
return -1;
}
else {
return stack.get(stack.size()-1);
}
}
}
public class Beakjoon10828 {
public static void main(String[] args) throws Exception {
Stack myStack = new Stack();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
for(int i=0; i<n; i++)
{
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String str = st.nextToken();
if(str.equals("push")) { //반드시 equals로 비교해야함(문자열 비교)
int a = Integer.parseInt(st.nextToken());
myStack.push(a);
}
else if(str.equals("pop")) {
bw.write(myStack.pop() + "\n");
bw.flush();
}
else if(str.equals("size")) {
bw.write(myStack.size() + "\n");
bw.flush();
}
else if(str.equals("empty")) {
bw.write(myStack.empty() + "\n");
bw.flush();
}
else{
bw.write(myStack.top() + "\n");
bw.flush();
}
}
}
}
메소드가 많아 코드가 길어보이지만 별 내용없다 문제에서 요구하는 그대로를 메소드로 만들었다.
다만 내가 하나 실수를 해서 생각지도 못한 곳에서 많은 시간을 허비했다. 바로 메인메소드에서 문자열 비교하며 확인해가는 로직에서 처음에 equals()를 사용하지 않고 == 비교 연산자를 사용해서 원하는 결과가 나오지 않았다. 애꿎은 스택 메소드들과 출력과정만 살펴보았다. 끝내 비교연산자가 눈에 들어왔고 보자마자 확신을 하며 수정하였고 원하는 코드를 완성하였다.(문자열을 비교할 때 ==비교연산자로 사용하면 주소값이 관여되므로 equals메소드를 사용해야한다. 이에 대해 다시한번 경각심을 심어줄 수 있었던 문제였다.)
반응형
'백준' 카테고리의 다른 글
[자바] 백준 - 2675번(문자열 반복) (0) | 2021.04.05 |
---|---|
[자바] 백준 - 1152번(단어의 개수) (0) | 2021.04.05 |
[자바] 백준 - 3052번(나머지) (0) | 2021.04.05 |
[자바] 백준 - 11720번 (숫자의 합) (0) | 2021.04.05 |
[자바] 백준 - 1065번(한수) (0) | 2021.04.05 |