[Java] 백준 10828 스택

정석·2024년 5월 6일

알고리즘 학습

목록 보기
26/67
post-thumbnail

🧑🏻‍💻 문제


💡문제 분석 요약

  • 입력 받는 정수로 Stack 자료구조에 연산을 수행한다.
  • N 의 최대는 10,000 이므로 이중 for문이 아닌 이상 모든 조건에서 수행가능할 거 같다.

💡알고리즘 설계

우선 반복 횟수인 N을 입력 받고, 각 반복마다 명령어 + 정수 혹은 명령어 를 입력 받는다.
입력 받은 명령어의 종류는 push pop size empty top 이 있으며 모두 스택 자료구조의 명령어이다.

명령어 출력 값

  • push -> stack.push(정수)
  • pop -> stack.pop()
  • size -> stack.size()
  • empty -> stack.isEmpty()
  • top -> stack.peek()

💡코드

public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int N = Integer.parseInt(br.readLine());
            Stack<Integer> stack = new Stack<>();

            for (int i = 0; i < N; i++) {
                String input = br.readLine();
                String[] tokens = input.split(" ");
                String command = tokens[0];

                // push 명령
                if (command.equals("push")) {
                    int temp = Integer.parseInt(tokens[1]);
                    stack.push(temp);
                }

                // pop 명령
                if (command.equals("pop")) {
                    if (stack.isEmpty()) {
                        System.out.println("-1");
                    } else {
                        int value = stack.pop();
                        System.out.println(value);
                    }
                }

                // size 명령
                if (command.equals("size")) {
                    int size = stack.size();
                    System.out.println(size);
                }

                // empty 명령
                if (command.equals("empty")) {
                    if (stack.isEmpty()) {
                        System.out.println("1");
                    } else {
                        System.out.println("0");
                    }
                }

                // top 명령
                if (command.equals("top")) {
                    if (stack.isEmpty()) {
                        System.out.println("-1");
                    } else {
                        int top = stack.peek();
                        System.out.println(top);
                    }
                }
            }
            br.close();
        }
    }


  • N 번의 반복 동안 input 변수에 사용자의 입력값을 저장
  • 저장된 입력값을 String 배열 tokens 에 저장 (input 배열에서 값을 공백 단위로 자른 값)
  • 명령어 즉, tokens 배열의 0번 인덱스를 기준으로 조건문 실행

💡시간복잡도

for 루프 N 번의 수행밖에 없으니 O(N) 의 시간복잡도를 갖는다.


💡 틀린 이유

입력 값 오류

  • 틀린 코드
for (int i = 0; i < N; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                String str = st.nextToken();
                int temp = Integer.parseInt(st.nextToken());

N번 동안 반복할 때, 명령어와 정수를 입력받는 부분에서 오류가 발생하였다.
만약, push 3 과 같은 경우에는 명령어는 str, 정수는 temp에 저장이 되지만, pop 과 같이 정수에 대한 입력값이 없을 경우 temp 의 값이 없기에 오류가 생겼다.


💡 틀린 부분 수정 or 다른 풀이

해당 오류를 수정하기 위해 BufferedReader 로 입력 받은 값을 공백을 기준으로 토큰을 잘라서 배열에 넣어 저장하도록 했다. 그럼 저장된 배열의 0번 인덱스는 무조건 명령어가 되고 정수가 있을 경우엔 1번 인덱스에 저장되게 된다.

  • 수정 코드
for (int i = 0; i < N; i++) {
                String input = br.readLine();
                String[] tokens = input.split(" ");
                String command = tokens[0];

이후 각 command 에 대한 조건문에 들어갈 때 정수가 필요한 명령어일 경우, tokens 배열의 1번 인덱스에서 정수 값을 꺼내서 사용한다.


💡 느낀점 or 기억할정보

반복되는 조건문에서 입력되는 정보가 다양할 때, 토큰을 잘라서 활용하도록 한다.

String input = br.readLine();
String[] tokens = input.split(" ");

0개의 댓글