본문 바로가기
백준

[백준] 단계별로 풀어보기(단계:18,스택,JAVA)10828번, 스택

by 열정적인 이찬형 2022. 2. 11.

문제 링크

10828번: 스택
 
www.acmicpc.net

주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

기본적으로 스택이란 LIFO(후입 선출)의 자료구조입니다.

LIFO는 먼저 들어간 데이터들이 출력할 때 나중에 나온다는 이야기입니다.

예를 들어 3, 2, 1을 순서대로 스택에 저장한 뒤 하나씩 꺼내보겠습니다.

1. 스택에 3을 넣었을 때

 
 
3

2. 스택에 2을 넣었을 때

 
2
3

3. 스택에 1을 넣었을 때

1
2
3

4. 스택에 하나의 자료를 출력하라는 명령이 떨어졌을 때

1
2
3

5. 다시 자료를 출력하라는 명령이 떨어졌을 때

 
2
3

위에 표를 보면 간단히 돌탑을 생각하시고 돌을 뺄 때 나중에 올린 돌부터 빼는 것처럼 스택은 LIFO의 형태를 가진 자료구조입니다.

 

이 문제에서는 push, pop, size, empty, top의 함수를 구현하여 스택에 형태처럼 구동하도록 하는 것입니다.

그래서 저는 ArrayList를 사용하여 스택에 형태를 구현하였습니다.

ArrayList는 자료를 저장하였을 때에 인덱스가 1씩 늘어나기 때문에 가장 최근에 들어간 자료에 인덱스는 ArrayList에 크기 - 1를 가지는 인덱스입니다.

그래서 pop 함수를 구현할 때 ArrayList에 값을 제거하는 인덱스를 ArrayList.size() - 1로 하였습니다.

나머지 함수들은 기본적인 ArrayList 명령어를 사용하여 구현하였습니다.

  • BufferedReader를 사용하여 입력 값을 받았습니다.
  • StringTokenizer를 이용하여 띄어쓰기 기준으로 명령어를 구분하였습니다.
  • 명령어에 대한 문자열에 따라 if문을 통해 함수들을 실행되게 하였습니다.
  • 문제에 제시한 함수 push, pop, top, size, empty를 구현하였습니다.
  • 함수에서 System.out.println을 사용하여 결과를 출력하였습니다.

결과 코드

import java.io.*;
import java.util.*;
public class Main{
	static List<Integer> list = new ArrayList<Integer>();
	public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //BufferedReader를 통해 입력 값 받기
        //--입력 값 저장 및 명령어 실행---------
    	int index = Integer.parseInt(br.readLine());
    	for(int i=0;i<index;i++) {
        	StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        	String text = st.nextToken();
        	if(text.equals("push"))
        		push(Integer.parseInt(st.nextToken()));
        	else if(text.equals("pop"))
        		pop();
        	else if(text.equals("size"))
        		size();
        	else if(text.equals("empty"))
        		empty();
        	else if(text.equals("top"))
        		top();
    	}
    	br.close();
	}
   	//push 함수
	public static void push(int n) {
		list.add(n);
	}
    	//pop 함수
	public static void pop() {
		if(list.size()==0)
			System.out.println("-1");
		else {
			System.out.println(list.get(list.size()-1));
			list.remove(list.size()-1);
		}
	}
   	//size 함수
	public static void size() {
		System.out.println(list.size());
	}
  	//empty 함수
	public static void empty() {
		if(list.size()==0)
			System.out.println("1");
		else
			System.out.println("0");
	}
   	//top 함수
	public static void top() {
		if(list.size()==0)
			System.out.println("-1");
		else
			System.out.println(list.get(list.size()-1));
	}
}

댓글