티스토리 뷰

Algorithm/Baekjoon

[백준] 10828번 스택(JAVA)

다교이 2022. 7. 28. 00:48

문제

- 정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램 작성

- push X : 정수 X를 스택에 넣기

- pop : 스택에서 가장 위에 있는 정수를 빼고, 그 수 출력. 만약 스택에 들어있는 정수가 없는 경우 -1 출력

- size : 스택에 들어있는 정수의 개수 출력

- empty : 스택이 비어있으면 1, 아니면 0 출력

- top : 스택의 가장 위에 있는 정수 출력. 만약 스택에 들어있는 정수가 없는 경우 -1 출력

 

해결방법

이번에 이 문제를 해결할 때에는 자바 내의 stack 클래스를 이용하여 문제를 해결하였다. push X (push(x)), pop (pop()), size(size()), empty(isEmpty()), top(peek()) 메소드를 이용하여 문제를 해결하였다.

지난 번에 문제를 해결한 코드를 보니 직접 배열로 스택을 구현하여 스택의 내부 동작 방식을 구현하였다. 

두 코드 다 통과가 되는 코드였지만 자바 내의 stack 클래스를 활용한 것(사진 중 위 코드에 해당)이 시간과 메모리가 더 작게 나왔다.

 

코드

- 배열로 구현한 stack

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();

        int N = sc.nextInt();
        int size = 0;

        int[] stack = new int[N];

        for(int i = 0; i<N; i++){
            switch(sc.next()){
                // push 연산 수행
                case "push":
                    int n = Integer.parseInt(sc.next());
                    stack[size] = n;			// 스택 배열에 입력된 수 추가
                    size++;				// size 늘려주기
                    break;
                // pop 연산 수행
                case "pop":
                    // size가 0보다 큰 경우에는
                    if (size>0){
                        // 가장 마지막 위치의 숫자 출력 후
                        sb.append(stack[size-1]).append('\n');
                        // 해당 숫자 초기화
                        stack[size-1] = 0;
                        // size 즐여주기
                        size--;
                    }
                    // size가 0보다 작은 경우에는
                    else{
                        // -1 출력
                        sb.append(-1).append('\n');
                    }
                    break;
                // size 연산 수행
                case "size":
                    // 이제까지 저장해둔 배열의 size 출력
                    sb.append(size).append('\n');
                    break;
                // empty 연산 수행
                case "empty":
                    // 배열의 size가 0일 때, 1 출력
                    if(size == 0){
                        sb.append(1).append('\n');
                    }
                    // 배열의 size가 0이 아닐 때, 0 출력
                    else{
                        sb.append(0).append('\n');
                    }
                    break;
                // top 연산 수행
                case "top":
                    // 배열의 size가 0일 때, -1 출력
                    if(size == 0){
                        sb.append(-1).append('\n');
                    }
                    // 배열의 size가 0이 아닐 때, 가장 마지막 위치의 숫자 출력
                    else{
                        sb.append(stack[size-1]).append('\n');
                    }
                    break;
                default:
                    break;
            }
        }
        System.out.println(sb);
        sc.close();
    }
}

- 자바 내의 Stack 클래스 이용

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

class Main{

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

        for(int i = 0; i<N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            String command = st.nextToken();
            // push 연산을 위해 push() 메소드 이용
            if(command.equals("push")) stack.push(Integer.parseInt(st.nextToken()));
            // pop 연산을 위해 pop() 메소드 이용
            else if(command.equals("pop")){
                if (stack.isEmpty()) sb.append(-1).append("\n");
                else sb.append(stack.pop()).append("\n");
            }
            // size 연산을 위해 size() 메소드 이용
            else if (command.equals("size")) sb.append(stack.size()).append("\n");
            // empty 연산을 위해 isEmpty() 메소드 이용
            else if (command.equals("empty")){
                if (stack.isEmpty()) sb.append(1).append("\n");
                else sb.append(0).append("\n");
            }
            // top 연산을 위해 peek() 메소드 이용
            else if(command.equals("top")){
                if (stack.isEmpty()) sb.append(-1).append("\n");
                else sb.append(stack.peek()).append("\n");
            }
        }

        System.out.println(sb);


        br.close();
    }
}

'Algorithm > Baekjoon' 카테고리의 다른 글

[백준] 10866번 덱(JAVA)  (0) 2022.07.28
[백준] 10845번 큐(JAVA)  (0) 2022.07.28
[백준] 10816번 숫자 카드 2(JAVA)  (0) 2022.07.28
[백준] 10814번 나이순 정렬(JAVA)  (0) 2022.07.25
[백준] 10773번 제로(JAVA)  (0) 2022.07.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday