지구정복

[자료구조] 백준 - 스택 본문

데이터 엔지니어링 정복/Algorithm

[자료구조] 백준 - 스택

nooh._.jl 2021. 7. 29. 16:05
728x90
반응형

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

 

10828번: 스택

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

www.acmicpc.net

 

-문제해설

자바의 경우 ArrayList를 이용해서 풀었다. 배열로 할 경우 pop명령어의 경우 인덱스를 신경쓰는게 귀찮았기 때문이다.

ArrayList를 쓰면 remove() 메소드를 사용할 수 있기 때문이다.

물론 코드의 효율은 배열을 이용하는게 더 좋다.

 

그리고 if문을 이용해서 명령어를 나눴는데 다른 사람 코드보니깐 switch문을 이용할 수 있었다.

나는 switch문은 문자열은 안되는 줄 알았는데 내가 잘못 알았나보다 ㅎㅎ

 

 

파이썬의 경우 리스트에 pop 메소드가 있기때문에 쉽게 구현할 수 있었다.

 

 

-자바

package dataStructure;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class BJ10828 {
	private static ArrayList<Integer> arr = new ArrayList<Integer>();
	
	private static void stack( String order, int a ) {
		arr.add( a );
	}
	
	private static String stack( String order ) {
		
		if( order.equals("top") ) {
			if( arr.size() == 0 ) return "-1";
			else return arr.get( arr.size()-1 )+"";
			
		} else if( order.equals("size") ) {
			return arr.size()+"";
			
		} else if( order.equals("empty") ) {
			if( arr.size() == 0 ) return "1";
			else return "0";
			
		} else { //if( order.equals("pop") )
			if( arr.size() == 0 ) return "-1";
			else {
				int tmp = arr.get( arr.size()-1 );
				arr.remove( arr.size()-1 );
				return tmp+"";
			}
		}
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuffer sb = new StringBuffer();
		int n = Integer.parseInt( br.readLine() );
		
		String order;
		
		
		for( int i=0; i<n; i++ ) {
			st = new StringTokenizer( br.readLine() );
			
			if( st.countTokens() == 2 ) {
				order = st.nextToken();
				int a = Integer.parseInt( st.nextToken() );
				stack( order, a );
				
			} else {
				order = st.nextToken();
				sb.append( stack( order ) + "\n" );
			}
		}
		
		System.out.println( sb );
	}
}

 

 

-파이썬

from sys import stdin
stack = []
next( stdin )
s = ""
for line in stdin:
    Order = line.split()
    
    if Order[0] == "push":
        stack.append( Order[1] )
    elif Order[0] == "pop":
        if stack: s += stack.pop()+"\n"
        else: s += "-1\n"
    elif Order[0] == "size":
        s += str( len(stack) )+"\n"
    elif Order[0] == "empty":
        if stack: s += "0\n"
        else: s += "1\n"
    elif Order[0] == "top":
        if stack: s += stack[-1]+"\n"
        else: s += "-1\n"
print( s )

 

728x90
반응형
Comments