[JAVA/10828번] 스택(Stack)

고지훈·2021년 8월 30일
1

Algorithm

목록 보기
1/68
post-thumbnail

문제


입력 및 출력


풀이

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]; //배열을 count개수만큼 할당 => 키보드로부터 입력을 총 count만큼 받기 때문
        int top = -1; //스택의 TOP위치, -1일 경우 스택은 비어있다.

        for (int i = 0; i < count; i++) {
            String[] input = br.readLine().split(" "); //공백을 기준으로 문자열을 나누어 input배열에 넣는다.
            switch (input[0]) { //input[0]와 case의 문자열이 일치하는 조건문 수행
                case "push": //top을 증가시키고, 스택의 top위치에 입력받은 숫자를 넣는다.
                    top++;
                    stack[top] = Integer.parseInt(input[1]);
                    break;
                case "pop": //스택의 제일 마지막에 push된 데이터를 출력하고 top의 위치를 1 감소시킨다.
                    if (top == -1) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(stack[top]);
                    top--;
                    break;
                case "size": // top+1을 하여 스택의 사이즈를 알 수 있다.
                    System.out.println(top + 1);
                    break;
                case "empty":
                    if (top == -1) {
                        System.out.println(1);
                    } else {
                        System.out.println(0);
                    }
                    break;
                case "top": // 배열의 가장 마지막에 push된 데이터를 출력한다.
                    if (top == -1) {
                        System.out.println(-1);
                        break;
                    }
                    System.out.println(stack[top]);
                    break;
            }
        }
    }
}

결과 및 해결방법

[결과]

[정리]

BufferedReader VS Scanner

  • BufferedReader는 버퍼를 이용하여 입출력을 수행하는 함수로, Scanner함수보다 속도가 빠르다.
  • BufferedReader는 키보드로부터 입력이 있을 때 마다, 한 문자씩 버퍼로 전송하고 버퍼의 내용이 가득 차거나 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램으로 전송한다.
  • Scanner는 버퍼를 사용하지 않기 때문에, 키보드의 입력이 이루어지는 순간 프로그램에 전송된다. 키보드의 입력이 이루어지는 순간 순간마다 데이터가 전송이 될 경우 부하가 생기고, 결론적으로 버퍼에 모아뒀다 한 번에 보내는 BufferedReader보다 성능이 떨어지게 된다.
  • Scanner는 스페이스와 개행문자를 경계로 입력 값을 인식하기 때문에 가공할 필요가 없어 손쉽게 사용할 수 있다.

Split

  • 문자열을 특정 문자를 기준으로 나누기 위한 함수이다.
  • 위 문제의 경우, PUSH연산 수행 시 뒤에 숫자가 붙기 때문에 공백을 기준으로 배열에 값을 넣었다.

해결방법

  • Stack을 사용해서 문제를 풀 수도 있지만, 배열을 사용하여 문제를 해결해보았다.
  • 스택은 후입선출방식으로 데이터를 처리하기 때문에 무엇보다 TOP의 위치가 중요하였다. TOP을 -1로 대입한 것 또한 배열의 인덱스는 0부터 시작하기 때문이다.
  • Split메소드를 통해 input 배열의 0번째 인덱스의 값을 기준으로 Switch-Case 문을 사용하여 입력받은 문자열과 Case 문자열을 비교하였다.
  • PUSH를 수행하게 될 때 TOP의 초기 위치는 -1이기 때문에, 1 증가시켜주었고 배열의 TOP 번째 인덱스에 입력받은 숫자를 저장하였다.
  • POP을 수행하게 될 때 배열의 TOP 번째 인덱스를 출력하고 1감소를 하였다.
  • SIZE를 수행하게 될 때 배열의 총 크기를 출력해야 하는데, TOP은 배열의 총 인덱스 개수를 나타내고 있으므로 여기에 1을 더하여 출력하였다.
  • EMPTY를 수행하게 될 때 비어있을 때 -1, 비어있지 않을 때 0을 출력해야 한다. 따라서 TOP을 이용하여 TOP이 -1인 경우 배열은 비어있는 경우이고, 그 외의 경우는 0을 출력하였다.
  • TOP을 수행하게 될 때 배열이 비어있지 않는 경우 배열의 제일위에 값을 출력하였다.
profile
"계획에 따르기보다 변화에 대응하기를"

0개의 댓글