본문 바로가기
백준

[백준] 10828번 : 스택 – JAVA [자바]

by Hongwoo 2022. 7. 9.
반응형

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

 

10828번: 스택

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

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 10828번 스택은 실버 4 난이도의 자료 구조 및 스택 문제이다. 스택에 대해서 잘 모른다거나 조금 더 공부하고 싶으면 밑에 있는 링크를 참고하면 되겠다.

 

https://propercoding.tistory.com/17

 

[자료구조] 스택(Stack)

목차 스택(Stack)의 개념 스택은 한쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out), 즉 후입 선출 형식의 자료 구조이다. 따라서 스택에서는 가장 마지막에 삽입된 데이터가 가장 먼저 삭제

propercoding.tistory.com

 

이 문제는 스택을 직접 구현하는 문제이다. 총 5가지의 명령이 있고 주어지는 명령을 처리하는 프로그램을 작성하면 된다. 

 

우선 이 문제는 배열이나 리스트 등 다른 자료 구조를 써서 스택을 구현할 필요는 없다. 자바에서 기본으로 제공되는 스택을 이용해서 문제를 풀면 된다. 우선 Integer를 저장하는 스택 stack을 선언한다. 이제 각 명령을 차례대로 살펴보겠다.

 

1. push X

스택에서 push는 스택 맨 위에 자료를 저장한다는 뜻이다. 그냥 stack.push(n)을 해주면 된다.

 

2. pop

pop 함수는 스택 맨 위에 있는 것을 제거하는 것이다. stack.pop() 한 것을 출력해주면 된다. 단 스택이 먼저 비어있는지 안 비었는지를 확인해주고 비어있으면 -1을 출력한다.

 

3. size

스택에 물건이 몇 개나 들어있는지를 확인해주는 함수이다. stack.size()를 하면 된다.

 

4. empty

스택이 비어있는지 안 비어있는지를 확인해주는 함수이다. stack.isEmpty()를 하면 된다. isEmpty()는 boolean을 반환하는 함수이다. 즉, 스택이 비어있으면 true를 반환시키고 비어있지 않으면 false를 반환한다. 따라서, true가 반환되면 1을, false면 0을 출력하면 된다.

 

5. top

스택에 맨 위에 있는 물건을 제거하지 않고 출력하면 된다. 먼저 pop 한 다음에 push 하는 방법도 있지만 peek() 함수를 쓰면 된다. peek() 함수는 스택 맨 위에 있는 물건을 제거하지 않고 반환하는 함수이다. 

 

자세한 코드는 밑에서 참고하면 되겠다.

 


  • 코드

 

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Integer> stack = new Stack<>();  //스택 선언
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(br.readLine());
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String s = st.nextToken();
            //push이면 스택에 x push
            if (s.equals("push")) stack.push(Integer.parseInt(st.nextToken()));

            if (s.equals("pop")) {
                if (stack.isEmpty()) {
                    sb.append(-1 + "\n");
                } else {
                    sb.append(stack.pop() + "\n");
                }
            }

            if (s.equals("size")) sb.append(stack.size() + "\n");

            if (s.equals("empty")) {
                if (stack.isEmpty()) {
                    sb.append(1 + "\n");
                } else {
                    sb.append(0 + "\n");
                }
            }

            if (s.equals("top")) {
                if (stack.isEmpty()) {
                    sb.append(-1 + "\n");
                } else {
                    sb.append(stack.peek() + "\n");
                }
            }
        }

        System.out.print(sb);
    }

}

 

 

반응형

댓글