백준 10828 스택 [JAVA]

Ga0·2023년 6월 9일
0

baekjoon

목록 보기
69/137
post-custom-banner

문제 해석

  • 첫번째 줄에는 명령어의 수 N을 입력받고, 두번째 줄부터는 명령어를 한줄에 하나씩 주어진다.
  • 명령어는 아래와 같다.
    1. push X: 정수 X를 스택에 넣는 연산이다.
    2. pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    3. size: 스택에 들어있는 정수의 개수를 출력한다.
    4. empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
    5. top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • push는 따로 출력할 필요가 없다. (정수 X를 넣기만 하면 된다.)

코드

import java.util.*;
import java.io.*;

public class Main {
    static ArrayList<Integer> stack = new ArrayList<>(); //정수를 담는 배열(스택)

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int N = Integer.parseInt(br.readLine()); //명령어의 수

        for(int i  = 0; i < N; i++){
            String str = br.readLine();

            if(str.contains(" ")){ //push인 경우만 공백이 존재해서 StringTokenizer 사용
                StringTokenizer st = new StringTokenizer(str);

                if(st.nextToken().equals("push")) { //push 명령어
                    push(Integer.parseInt(st.nextToken())); //push는 따로 출력할게 없음
                }
            }

           if(str.equals("pop")){ //pop 명령어
               bw.write(pop() + "\n");
           }else if(str.equals("size")){ //size 명령어
               bw.write(size() + "\n");
           }else if(str.equals("empty")){ //empty 명령어
               bw.write(empty() + "\n");
           }else if(str.equals("top")){ //top 명령어
               bw.write(top() + "\n");
           }
        }

        br.close();
        bw.flush();
        bw.close();
    }

    //push 명령어
    static void push(int num){
        stack.add(num); //요소 추가
    }

    //pop 명령어
    static int pop(){
        if(empty() == 1){ //스택이 비어있으면
            return -1; //정수가 없는 경우
        }

        //pop을 할때 가장 최근에 추가한 것을 뺀다
        int popNum = top(); //삭제되면 사라지니까 미리 변수에 저장한다.

        stack.remove(stack.size()-1); //최근에 추가한 것을 삭제한다.

        return popNum;
    }

    //size 명령어
    static int size(){
        return stack.size();
    }

    //empty 명령어
    static int empty(){
        if(stack.size() <= 0){ //비어있으면
            return 1;
        }
        return 0; //비어있지 않으면
    }

    //top 명령어
    static int top(){
        if(empty() == 1){ //스택이 비어있으면 -1 출력
            return -1;
        }

        // stack(스택)은 LIFO구조로 새로운 요소는 TOP으로 쌓이는데
        // 가장 위에 있는 것이 최근에 추가한 요소인 것이다.
        // (즉 ArrayList의 마지막 인덱스에 있는 것이 최근 것!)
        return stack.get(stack.size()-1); //맨 위에 있는 정수 출력
    }

}
  • 코드에 대한 설명은 주석으로 자세히 작성해두었다.

결과

느낀 점

  • 스택이라해서 조금 처음엔 겁먹었는데, 내 방식대로 쉽게 풀어 작성하니까 금방 풀었다.
  • 대신 효율적인 코드인지는 잘 모르겠다..ㅎ
post-custom-banner

0개의 댓글