
이 문제는 스택의 기본 원리는 이용한 문제이다.
문제 이해
[ 스택(Stack) 이해하기 ]
[ 데이터 입력 순서 ]
[ 데이터 출력 순서 ]
숫자를 명령으로 입력받는 문제이다.
1부터 5까지의 숫자를 입력받고 숫자별로 동작을 다르게 설정하여 그에 맞는 값을 출력하면 된다.
그러기 위해서는 기본적으로 스택에 대한 이해 가 필요하며 아래의 순서대로 코드를 작성해볼 수 있다.
한번에 정답코드를 보지 않고 혼자 풀어보고 싶은 사람 에게는 아래의 단계를 보고 스스로 생각해 보는 것을 추천한다.
코드 이해
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class App {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
int menu = Integer.parseInt(st.nextToken());
switch (menu) {
case 1:
stack.push(Integer.parseInt(st.nextToken()));
break;
case 2:
if (stack.empty()) {
sb.append(-1).append("\n");
} else {
sb.append(stack.pop()).append("\n");
}
break;
case 3:
sb.append(stack.size()).append("\n");
break;
case 4:
if (stack.empty()) {
sb.append(1).append("\n");
} else {
sb.append(0).append("\n");
}
break;
case 5:
if (stack.empty()) {
sb.append(-1).append("\n");
} else {
sb.append(stack.peek()).append("\n");
}
}
}
System.out.println(sb);
}
}
위에 제시된 문제를 보면 1,2,3,4,5일 경우의 동작 방법이 모두 다르다.
이 경우엔 if문 보다는 입력된 값에 따라 실행로직이 다른 switch-case문으로 작성하는 것이 훨씬 가독성이 좋다.
입력되는 명령문의 개수( n )을 입력받는다.
n번만큼 for문을 돌려 명령( menu )을 입력받는다.
1일 경우 입력이기 때문에 뒤에 입력될 숫자를 하나 더 입력받아야 한다.
-> menu가 1일 경우에만 int 변수를 하나 더 생성하여 stack에 입력할 수를 저장 push() 한다.
2의 경우 stack에 숫자가 있으면 해당 숫자를 출력하면서 stack에서 삭제, stack에 숫자가 없으면 -1이다.
-> stack에 값이 있는지 확인하려면 stack명.empty() ( boolean타입)로 확인할 수 있다.
3의 경우 스택에 있는 값의 개수를 출력하면 된다.
-> stack명.size() 로 stack의 길이를 구할 수 있다. 이는 스택이 가진 값의 개수와 같다.
4의 경우 단순히 스택의 empty() 여부만 확인해서 1 or 0을 반환하면 된다.
5의 경우 stack에 값이 있으면 가장 위에 있는 값을 출력만 하고, 없으면 -1을 반환한다.
-> 2번과 다른 점은 값을 출력 or 값을 출력 + 삭제 가 다른 점이며, 메소드 pop() 과 peek() 의 차이점이기도 하다.
case의 동작 마지막에는 break문 을 잊으면 안된다.
menu에 따른 동작을 수행해서 구해진 값을 StringBuilder에 삽입한 후 한번에 출력한다.
한줄평
스택에 대한 기본적인 개념만 알고 있으면 충분히 코드를 응용하여 풀 수 있는 문제였다.
자료구조에 대한 내용이어서 등급이 높게 책정된 것 같은데,
스택의 구조에 대한 이해와 기본 코드 개념만 있다면 쉽게 풀 수 있는 문제이다.