[백준] 28278 _ 스택 2 (Java)

nyez·2024년 5월 14일

Coding Test

목록 보기
3/11
post-thumbnail
정답코드와 결론은 맨 아래에-!!

이 문제는 스택의 기본 원리는 이용한 문제이다.


문제 이해

[ 스택(Stack) 이해하기 ]

  • 선입후출의 구조 (First In Last Out)
  • 데이터 추출 시 들어간 값의 반대 순서로 정렬됨
  • push(), pop(), peek(), empty() 메소드





[ 데이터 입력 순서 ]

  • 삽입1 - 삽입2 - 삽입3

[ 데이터 출력 순서 ]

  • 삽입3 - 삽입2 - 삽입1





숫자를 명령으로 입력받는 문제이다.
1부터 5까지의 숫자를 입력받고 숫자별로 동작을 다르게 설정하여 그에 맞는 값을 출력하면 된다.
그러기 위해서는 기본적으로 스택에 대한 이해 가 필요하며 아래의 순서대로 코드를 작성해볼 수 있다.

한번에 정답코드를 보지 않고 혼자 풀어보고 싶은 사람 에게는 아래의 단계를 보고 스스로 생각해 보는 것을 추천한다.

  1. 입력받을 명령의 개수를 변수에 저장
  2. 변수만큼 for문을 돌리면서 명령 입력받기
  3. 명령에 따라 다른 동작 설정하기
    -> if문 말고 사용할 수 있는 다른 구조가 있지 않을까?
  4. 명령에 따른 값 출력하기
    -> 바로 출력하는 방법 말고 한번에 모아뒀다가 출력할 수 있는 방법은 없을까?

코드 이해

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문으로 작성하는 것이 훨씬 가독성이 좋다.

  1. 입력되는 명령문의 개수( n )을 입력받는다.

  2. 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문 을 잊으면 안된다.

  3. menu에 따른 동작을 수행해서 구해진 값을 StringBuilder에 삽입한 후 한번에 출력한다.


한줄평

  • 스택에 대한 기본적인 개념만 알고 있으면 충분히 코드를 응용하여 풀 수 있는 문제였다.

  • 자료구조에 대한 내용이어서 등급이 높게 책정된 것 같은데,
    스택의 구조에 대한 이해와 기본 코드 개념만 있다면 쉽게 풀 수 있는 문제이다.

profile
개발 기록 끄적이기👩🏻‍💻

0개의 댓글