Algorithm/백준 알고리즘

[백준 알고리즘 / JAVA] 10828번 스택

newtownboy 2023. 6. 27. 23:19


문제 정보

  • 문제 링크: https://www.acmicpc.net/problem/10828
  • 문제 번호: 10828번
  • 문제 이름: 스택
  • 문제 난이도: 실버 4
 

10828번: 스택

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

www.acmicpc.net


코드

import java.io.*;

class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int count = Integer.parseInt(br.readLine());
        int[] stack = new int[count];
        int top = -1;

        for (int i = 0; i < count; i++) {
            String[] input = br.readLine().split(" ");
            switch (input[0]) {
                case "push":
                    top++;
                    stack[top] = Integer.parseInt(input[1]);
                    break;
                case "pop":
                    if (top == -1) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(stack[top]);
                    top--;
                    break;
                case "size":
                    System.out.println(top + 1);
                    break;
                case "empty":
                    if (top == -1) {
                        System.out.println(1);
                    } else {
                        System.out.println(0);
                    }
                    break;
                case "top":
                    if (top == -1) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(stack[top]);
                    break;
            }
        }
    }
}

풀이

Step1: 스택 초기화 및 연산 개수 입력받기

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = Integer.parseInt(br.readLine());
int[] stack = new int[count];
int top = -1;
  • `BufferedReader`를 사용하여 입력을 받을 수 있는 준비를 합니다.
  • `count`변수에 사용자로부터 입력받은 연산 개수를 저장합니다.
  • `stack`배열을 int형으로 선언하고, 크기를 `count`만큼 할당합니다.
  • `top`변수를 -1로 초기화합니다. 이 변수는 스택의 가장 위에 있는 원소의 인덱스를 가리킵니다.

Step2: 연산 수행

for (int i = 0; i < count; i++) {
    String[] input = br.readLine().split(" ");
    switch (input[0]) {
        case "push":
            top++;
            stack[top] = Integer.parseInt(input[1]);
            break;
        case "pop":
            if (top == -1) {
                System.out.println(-1);
                break;
            }
            System.out.println(stack[top]);
            top--;
            break;
        case "size":
            System.out.println(top + 1);
            break;
        case "empty":
            if (top == -1) {
                System.out.println(1);
            } else {
                System.out.println(0);
            }
            break;
        case "top":
            if (top == -1) {
                System.out.println(-1);
                break;
            }
            System.out.println(stack[top]);
            break;
    }
}
  • `count`만큼 반복문을 수행하여 연산을 처리합니다.
  • `br.readLine().split(" ")`을 사용하여 사용자로부터 입력받은 문자열을 공백을 기준으로 문자열을 나눕니다.
  • `switch`문을 사용하여 입력된 연산의 종류에 따라 동작을 수행합니다.
    1. "push"인 경우
      • `top`을 1증가시킨 후, `input[1]`값을 정수로 변환하여 `stack[top]`에 저장합니다.
    2. "pop"인 경우
      • 스택이 비어있는지 확인하여 `top`이 -1인 경우에는 -1을 출력하고, 그렇지 않은 경우에는 `stack[top]`의 값을 출력한 후 `top`을 1 감소시킵니다.
    3. "size"인 경우
      • 현재 스택에 저장된 원소의 개수를 출력합니다. `top`의 값이 최초에 -1로 저장했기 때문에 +1 연산을 수행하여 출력합니다.
    4. "empty"인 경우
      • 스택이 비어있는지 확인하여 `top`이 -1인 경우에는 1을 출력하고, 그렇지 않은 경우에는 0을 출력합니다.
    5. "top"인 경우
      • 스택이 비어있는지 확인하여 `top`이 -1인 경우에는 -1을 출력하고, 그렇지 않은 경우에는 `stack[top]`의 값을 출력합니다.