지구정복

[자료구조] 백준 - 덱 본문

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

[자료구조] 백준 - 덱

nooh._.jl 2021. 7. 29. 20:36
728x90
반응형

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

 

10866번: 덱

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

www.acmicpc.net

 

-문제해설

자바로는 배열을 이용해서 풀었다. 이때 pop_front나 pop_back, push_front같은 경우 인덱스값을 잘 활용해서 

배열의 값을 한 칸씩 미루거나 땡겨줘야 한다. 

 

파이썬은 리스트 구조여서 push같은 경우 insert( 인덱스, 삽입값 ) 메소드를 잘 활용하면 되고

pop같은 경우 pop(인덱스)를 활용하면 쉽게 풀 수 있다.

 

 

-자바

package dataStructure;

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

public class BJ10866 {
	private static String[] deque = new String[10001];
	private static int idx;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuffer sb = new StringBuffer();
		int n = Integer.parseInt( br.readLine() );
		
		StringTokenizer st;
		String order;
		String value = null;
		
		while( n --> 0 ) {
			st = new StringTokenizer( br.readLine() );
			
			order = st.nextToken();
			if( st.countTokens() == 1 ) value = st.nextToken();

			switch( order ) {
			case "push_front":
				if( idx == 0 ) deque[idx++] = value;
				else {
					for( int i=idx; i>0; i-- ) deque[i] = deque[i-1];
					deque[0] = value;
					idx++;
				}
				break;
				
			case "push_back":
				deque[idx++] = value;
				break;
				
			case "pop_front":
				if( idx == 0 ) sb.append( "-1\n" );
				else {
					sb.append( deque[0]+"\n" );
					for( int i=0; i<idx-1; i++ ) deque[i] = deque[i+1];
					idx--;
				}
				break;
				
			case "pop_back":
				if( idx == 0 ) sb.append( "-1\n" );
				else {
					sb.append( deque[--idx]+"\n" );
					deque[idx] = null;
				}
				break;
				
			case "size":
				sb.append( idx+"\n" ); 
				break;
				
			case "empty":
				if( idx == 0 ) sb.append( "1\n" );
				else sb.append( "0\n" );
				break;
				
			case "front":
				if( idx == 0 ) sb.append( "-1\n" );
				else sb.append( deque[0]+"\n" );
				break;
				
			case "back":
				if( idx == 0 ) sb.append( "-1\n" );
				else sb.append( deque[idx-1]+"\n" );
				break;
			}
			
		}
		System.out.println( sb );
	}
}

 

 

-파이썬

from sys import stdin
deq = []
next( stdin )

for l in stdin:
    Order = l.split()
    
    if Order[0]=="push_front":
        if deq: deq.insert(0, Order[1] )
        else: deq.append( Order[1] )
        
    if Order[0]=="push_back":
        deq.append( Order[1] )
    
    if Order[0]=="pop_front":
        if deq: print( deq.pop(0) )
        else: print( -1 )
    
    if Order[0]=="pop_back":
        if deq: print( deq.pop() )
        else: print( -1 )
    
    if Order[0]=="size":
        print( len(deq) )
    
    if Order[0]=="empty":
        if deq: print( 0 )
        else: print( 1 )
    
    if Order[0]=="front":
        if deq: print( deq[0] )
        else: print( -1 )
    
    if Order[0]=="back":
        if deq: print( deq[-1] )
        else: print( -1 )
728x90
반응형
Comments