백준 문제풀이

[백준] 10828번 스택 [JAVA]

늦깍이 2022. 9. 13. 09:31

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net


     문제

     문제 풀이

  • 스택의 구현 문제이다. 기존의 스택을 import해오는 것이 아닌 직접 구현하는 방식으로 하자.
  • 푼 방법
    1. 구현 시 노드(링크)와 배열을 통해 구현이 가능한데, 배열로 구현하도록 하였다.
    2. 배열로 구현시 각 명령에 대해 어떻게 하는지 보도록 하자.
    *size의 초기값을 -1로 설정하였는데, 그 이유는 인덱싱을 할 때 size를 변형하지 않고 사용하고 싶었기 때문이다.
    > push : size를 하나 늘리고, 그 자리에 값을 넣는다.
    > pop : 현재 size값 인덱스에 있는 값을 출력하고, size를 줄인다. 이렇게 되었을 때, pop한 이후의 값이 사라지는 것은 아니지만, size를 통해서만 접근을 하기 때문에 사라진 것처럼 활용이 가능하다.(자바의 경우, 가비지 컬렉터가 작동할 것이라고 추측한다.)
    > size : size의 초기값이 -1이였으므로 size + 1 을 출력하도록 한다.
    > empty : size가 -1 인지 아닌지를 체크하면 된다.
    > top : size값 인덱스에 있는 값을 출력만 한다.

      주의했던 점

  • 자바에 아직 익숙하지가 않아, buffererReader를 통해 문자를 받는 것까진 알지만, 한 줄에 여러 개의 문자(예> push 1) 의 경우 어떻게 하는지 몰랐다. 문제와는 상관없지만 잘 알고 있도록 하자.
  • if else 구문을 통해 문제를 풀게 되면, else if를 남발해야되서 코드가 많이 지저분해질 것이다. 코드는 깔끔하게 하는 것이 좋으므로,  switch 구문을 사용하도록 하자.

        JAVA code

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class baekjoon10828 {

    public static int[] stack;
    public static int size = -1;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();

        stack = new int[N];

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String S = st.nextToken();
            int ans;
            switch (S) {
                case "push":
                    push(Integer.parseInt(st.nextToken()));
                    break;
                case "pop":
                    ans = pop();
                    System.out.println(ans);
                    break;
                case "size":
                    ans = size();
                    System.out.println(ans);
                    break;
                case "empty":
                    ans = empty();
                    System.out.println(ans);
                    break;
                case "top":
                    ans = top();
                    System.out.println(ans);
                    break;
            }
        }
    }

    public static void push(int item) {
        size++;
        stack[size] = item;
    }

    public static int pop() {
        if (size == -1)
            return -1;
        else {
            return stack[size--];
        }
    }

    public static int size() {
        return size + 1;
    }

    public static int empty() {
        if (size == -1)
            return 1;
        else
            return 0;
    }

    public static int top() {
        if (size == -1)
            return -1;
        else
            return stack[size];
    }
}

'백준 문제풀이' 카테고리의 다른 글

[백준] JAVA로 백준 입력 받는 방법  (0) 2022.09.14
[백준] 10845번 큐 [JAVA]  (0) 2022.09.13
[백준] 9012번 괄호 [JAVA]  (2) 2022.09.13
[백준] 10773번 제로 [JAVA]  (0) 2022.09.11
[백준] 1874번 스택 수열 [JAVA]  (2) 2022.09.11