[BOJ] 10828번 스택 - JAVA

최영환·2024년 4월 30일
0

💡 문제

💬 입출력 예시

📌 풀이(소스코드)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    static int N, idx;
    static int[] stack = new int[10001];

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        N = Integer.parseInt(br.readLine());
        idx = -1;

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            String cmd = st.nextToken();
            if (cmd.equals("push")) {
                push(Integer.parseInt(st.nextToken()));
            } else if (cmd.equals("pop")) {
                sb.append(pop()).append("\n");
            } else if (cmd.equals("size")) {
                sb.append(size()).append("\n");
            } else if (cmd.equals("empty")) {
                sb.append(empty()).append("\n");
            } else if (cmd.equals("top")) {
                sb.append(top()).append("\n");
            }
        }

        System.out.println(sb);
    }

    private static void push(int x) {
        stack[++idx] = x;
    }

    private static int pop() {
        if (size() == 0) {
            return -1;
        }
        return stack[idx--];
    }

    private static int size() {
        return idx + 1;
    }

    private static int empty() {
        if (size() == 0) {
            return 1;
        }
        return 0;
    }

    private static int top() {
        if (size() == 0) {
            return -1;
        }
        return stack[idx];
    }
}

📄 해설

접근

  • 정수형 스택과 그 연산들을 구현하는 문제. 정수형 배열을 사용해서 구현해봤다.
  • 스택의 연산들은 전부 메소드로 작성. 스택의 기본 개념을 알고 Java 의 배열 사용법을 알고 있다면 충분히 쉽게 풀이 가능하다.
  • 정수 배열로 스택을 처음 구현한다면 인덱스를 다루는 부분이 조금 헷갈릴 수 있으나, 스택의 개념을 안다면 금방 이해할 것이다.

과정

  • N 을 입력 받고, 스택의 top 인덱스 가리킬 idx 는 -1 로 초기화. 0으로 초기화해도 상관은 없으나, 메소드들에서의 연산을 본 풀이와 다르게 해야한다.
  • N 개의 명령어를 입력 받고 각각에 맞는 메소드를 호출하면 main 메소드 부분은 완료된다. 출력을 하는 명령어의 경우는 StringBuilderappend하여 출력문을 만들어준다.
  • 아래는 각 메소드들에 대한 설명
    • push(int x) : 스택에 x 를 추가한다. 이때, idx 를 -1 로 초기화 했으므로 ++idx 를 통해 ArrayIndexOutOfBoundsException 예외를 피해줘야한다.
    • size() : 스택 탑의 인덱스 번호 + 1 이어야 하므로, idx + 1 을 반환한다. pop(), empty(), top() 메소드에서 스택이 비어있는지 여부를 확인하는 메소드
    • pop() : 스택이 비어있으면 -1 을 반환하고, 그렇지 않으면 idx-- 를 통해 먼저 출력하고 idx 를 감소시켜줘야한다. 이유는 push 메소드와 동일
    • empty() : 스택이 비어있으면 1 을 반환하고, 그렇지 않으면 0 을 반환한다.
    • top() : 스택이 비어있으면 -1 을 반환하고, 그렇지 않으면 stack[idx] 를 반환한다.
profile
조금 느릴게요~

0개의 댓글