본문 바로가기
Programming/Algorithm

백준 알고리즘 10828 스택 구현하는 방법 JAVA

by 하하호호 2022. 2. 21.
반응형

 

 

백준 알고리즘 10828은 스택을 구현하는 알고리즘이다. 스택 알고리즘은 LIFO 방식의 자료구조다. 가장 나중에 입력된 값이 가장 먼저 출력되는 알고리즘이다. 스택 알고리즘을 가장 많이 사용하는 곳이 뒤로가기 앞으로가기 등의 웹 브라우저 인터페이스나, 문서 작업시 Undo, Redo 작업에 사용된다.

 

프로그램 시 운영체제에서도 스택 알고리즘을 사용해서 스택 메모리 영역을 관리한다. 스택영역에는 지역변수와 매개변수가 저장된다. 함수의 호출과 함께 할당되며, 함수 호출이 완료되는 순간 소멸된다. 이를 스택프레임(Stack Frame)이라 한다. 스택에서 현재 위치를 알려주는 스택포인터를 활용하여 알고리즘 구현이 완성된다.

 

스택에서는 대표적으로 POP(), PUSH() 메소드를 사용한다. PUSH() 메소드가 호출되면 입력값을 스택에 추가하고 스택포인터가 1 추가되면서 스택의 영역이 추가된다. POP() 메소드를 사용해서 스택의 데이터가 출력되고 스택포인터는 1 감소하게 된다.

 

 

스택 프레임(출처 : TCP SCHOOL.com)

 

문제

백준 알고리즘 10828 스택은 5가지의 메소드를 구현하게 되어 있다. PUSH, POP은 스택의 데이터 입출력을 담당한다. SIZE()는 스택 내의 정수의 갯수를 의미한다. 스택을 담고 있는 배열의 전체길이를 의미하는 것이 아니다. EMPTY() 메소드는 스택 정수의 유무를 판단하는 Boolean 값을 출력한다. 마지막으로 TOP() 메소드는 현재 스택내의 가장 위에 있는 정수를 출력한다. (스택포인터-1)가 가리키는 정수를 출력하면 된다.

 

JAVA 코드

백준 알고리즘 10828 문제는 입력값을 받은 다음 연산 후 출력을 하게 되어 있다. 즉 StringBuilder()에 연산 값을 APPEND() 한 다음 한번에 출력해줘야 한다. StringBuilder sb를 사용한다. 

 

입력된 명령어를 String으로 받아서 switch~case 문으로 상황값을 정리한다. PUSH() 메소드는 명령어+정수값 형태로 입력되기 때문에 in.next()메소드로 공백으로 구분되는 입력 메소드를 사용한다.

 

PUSH, POP, EMPTY, SIZE, TOP 메소드를 개별적으로 구현해 준 뒤 MAIN 메소드에서 FOR문을 순회하면서 연산한다.  출력값은 StringBuilder에 APPEND 한 후 한번에 출력한다.

/*
    STACK 구현하기
*/

import java.util.Scanner;

public class A_10828 {
    public static int[] arr;
    public static int stackPointer=0;
    public static StringBuilder sb = new StringBuilder();

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        arr = new int[N+1];

        for(int i=0; i<N; i++){
            String ch = in.next();
            
            switch(ch){
                case "push":
                    int X = in.nextInt();
                    push(X);
                    break;
                case "pop":
                    sb.append(pop()+"\n");
                    break;
                case "size":
                    sb.append(size()+"\n");
                    break;
                case "empty":
                    sb.append(empty()+"\n");
                    break;
                case "top":
                    sb.append(top()+"\n");
                    break;
            }
        }
        System.out.println(sb);

    }

    public static void push(int X){
        arr[stackPointer] = X;
        stackPointer++;
    }
    public static int pop(){
        if(stackPointer<1){
            return -1;
        }else{
            stackPointer--;
            return arr[stackPointer];
        }
        
    }
    public static int size(){
        return stackPointer;
    }
    public static int empty(){
        
        if(stackPointer<=0){
            
            return 1;
        }else{
            
            return 0;
        }
    }
    public static int top(){
        if(stackPointer<=0){
            return -1;
        }else{
            return arr[stackPointer-1];
        }
        
        
    }
}
반응형

댓글