IT 삽질기

백준 10828번 스택 문제 본문

코딩 문제

백준 10828번 스택 문제

화이팅빌런 2019. 4. 7. 23:27

백준 10828번 스택 문제를 풀어보자.

 

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

 

10828번: 스택

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

www.acmicpc.net

스택이란?

한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out) 형식의 자료 구조로

가장 최근에 추가된 추가된 데이터가 가장 먼저 나오는 자료구조이다.

 

문제에서 요구된 항목은 아래와 같다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

문제를 java로 해결하기 위해 ArrayList를 이용해 구현했다.

Class를 생성해 각각의 기능별 method를 구현하고 입력에 따라 알맞은 method를 호출하였다.

 

ArrayList에서 마지막 index값을 저장하고 pop, top등의 동작을 수행하기 위해 head를 가르키는 변수를 두고 -1인 경우를 stack가 비어있는 경우로 하여 empty를 판별할 수 있도록 해결하였다.

import java.util.*;

class my_stack {

    ArrayList stack = new ArrayList<>();
    int head = -1;

    public my_stack()
    {

    }

    public void push(int num)
    {
        this.stack.add(num);
        head += 1;
    }
    
    public int pop()
    {
        if(head == -1) return -1;
        else
        {
            int value = stack.remove(head);
            head-=1;
            return value;
        }
    }
    public int size()
    {
        return head+1;
    }
    
    public int empty()
    {
        if(head == -1) return 1;
        else return 0;
    }

    public int top()
    {
        if(head == -1) return -1;
        else return stack.get(head);
    }

}



public class sol_10828 {
    public static void main(String[] args) throws Exception {

        Scanner in = new Scanner(System.in);
        String input_string = "";
        String command = "";
        String num = "";

        int a = in.nextInt();
        in.nextLine();

        my_stack ms = new my_stack();

        for(int i=0; i<a; i++)
        {
            input_string = in.nextLine();
            
            if (input_string.split(" ").length == 2)
            {
                command = input_string.split(" ")[0];
                num = input_string.split(" ")[1];

                if (command.equals("push")) ms.push(Integer.parseInt(num));
            }
            else
            {
                command = input_string;
                if (command.equals("pop")) System.out.println(ms.pop());
                else if (command.equals("size")) System.out.println(ms.size());
                else if (command.equals("empty")) System.out.println(ms.empty());
                else if (command.equals("top")) System.out.println(ms.top());
            }

        }
        in.close();
    }
}


 

Comments