한 걸음 두 걸음

baekjoon 백준 문제풀기 ] 10828 스택! (JAVA) 본문

CSE/baekjoon & swexpert

baekjoon 백준 문제풀기 ] 10828 스택! (JAVA)

언제나 변함없이 2019. 1. 26. 12:04
반응형

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
push X: 정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 스택에 들어있는 정수의 개수를 출력한다.
empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

java.util.stack에서 제공하는 라이브러리를 활용하여 문제를 풀었다.

스택 자료구조는 import java.util.stack;에 있고 이는 java documentation에 잘 나와있다.

제공하는 메소드는 push, pop, peek, empty, search 등이 있으며 사용방법은 다음과 같다.

  1. Stack 객체 만들기 : Stack stack = new Stack<>();
  2. push 함수 : stack.push(데이터); //데이터 자료형 맞춰주어야함
  3. pop 함수 : stack.pop(); //만약 data가 없을 때 pop하면 EmptyStackException 발생
  4. peek 함수 : stack.peek(); // 만약 data가 없을 때 peek EmptyStackException 발생
  5. empty 함수 : stack.empty(); // 비어있으면 true 뭔가 차있으면 false
  6. search 함수 : stack.search(index); //index번째에 있는 element값을 보여준다.

이를 이용하여 java로 풀었다.

import java.util.*;

public class main {

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>(); //java.util.Stack으로 제공받는 Stack 라이브러리
        Scanner sc = new Scanner(System.in);

        int num = sc.nextInt();
        String order;
        int data = 0;
        int buffer;
        boolean buffer2;

        for(int i = 0; i < num; i++) {
            order = sc.next(); //한 단어만 받도록 설정!

            switch(order) {
            case "push":
                data = sc.nextInt();
                stack.push(data);
                continue;
            case "pop":
                try {
                     buffer = stack.pop();
                }catch(EmptyStackException e){
                    buffer = -1;
                    }                
                System.out.println(buffer);
                continue;
            case "size":
                System.out.println(stack.size());
                continue;
            case "empty":
                buffer2 = stack.empty();
                if(buffer2 == false) buffer = 0; else buffer = 1; 
                System.out.println(buffer);
                continue;
            case "top":
                try {
                     buffer = stack.peek();
                }catch(EmptyStackException e){
                    buffer = -1;
                    }    
                System.out.println(buffer);
                continue;

            }
        }

    }

}

추가

pop이나 peek의 경우 스택이 비어있을 때 호출할 경우 에러가 발생하기 때문에 try-catch를 사용했다.
push의 경우 push문자열을 받은 후 숫자를 한 번 더 받으므로 next()함수와 nextInt()를 사용했다.(nextLine은 엔터가 나올때까지 받으므로 X)
스택 라이브러리를 활용하지않고 스택을 구현하기 위해서는 배열이나 연결리스트를 사용하면 된다. 배열의 경우 스택의 크기가 고정되는 단점이 있어 isFull등의 함수가 필요할 수 있다.

반응형