본문 바로가기
Baekjoon/[1] 자료구조

[백준] 10866번 덱 JAVA (자바) 풀이

by Poorm 푸름 2023. 6. 27.

문제 10866번

 : 아래와 같은 [명령] 덱으로 구현해보기 

 

 [명령]

  

  push_front X  정수 X를 덱 앞에 넣는 연산
  push_back X  정수 X를 덱 뒤에 넣는 연산
  pop_front  덱에서 가장 앞에 있는 정수를 빼고 그 수를 출력, 큐에 정수가 없는 경우에 -1을 출력
  pop_back  덱에서 가장 뒤에 있는 정수를 빼고 그 수를 출력, 큐에 정수가 없는 경우에 -1을 출력
  size  덱에 들어있는 정수의 개수 출력
  empty  덱이 비어있으면 1, 아니면 0 출력
  front  덱의 가장 앞에 있는 정수를 출력. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력
  back  덱의 가장 뒤에 있는 정수를 출력. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력

 

 [입력]


 : 첫째 줄에 주어지는 명령의 수 N 

 : 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다

 

 

 [출력]


 : 명령 출력할 때마다 한 줄에 하나씩 출력



 [덱]


 : 덱은 들어가는 문, 나가는 문 각각 2개씩 (입구와 출구를 양쪽에 모두 만든 자료구조)

 : Queue(큐)는 선입선출, 데이터 입구와 출구가 반대편에 있고 단방향 자료구조이다 (에스컬레이터)

 : 역방향으로 참조하거나 반대로 넣어야 할 경우 Deque(덱)사용 

 

 

 [덱 연산]

 

 init()  덱 초기화
 create()  덱 생성
 isEmpty()  덱 비어있는지 검사
 isFull()  덱 가득 찼는지 검사 
 getFirst()  덱 맨 앞의 값 출력 (덱 비어 있는 경우 에러 발생)
 getLast()  덱 맨 뒤의 값 출력 (덱 비어 있는 경우 에러 발생)
 peekFirst() / peek  덱 맨 앞의 값 출력 (덱 비어있는 경우 null 반환)
 peekLast()  덱 맨 뒤의 값 출력 (덱 비어있는 경우 null 반환)
 element()  덱 맨 앞의 값 출력 (덱 비어 있는 경우 에러 발생)
 offerFirst(e)  덱의 맨 앞에 e 추가 (덱 비어있는 경우 null 반환)
 offerLast(e) / offer  덱의 맨 뒤에 e 추가 (덱 비어있는 경우 null 반환)
 addFirst(e)  덱의 맨 앞에 e 추가(덱 비어 있는 경우 에러 발생)
 addLast(e)  덱의 맨 뒤에 e 추가(덱 비어 있는 경우 에러 발생)
 pollFirst() / poll  덱의 맨 앞의 값 제거하고 출력 (덱 비어있는 경우 null 반환)
 pollLast()  덱의 맨 뒤의 값 제거하고 출력 (덱 비어있는 경우 null 반환)
 removeFirst()  덱의 맨 앞의 값 제거하고 출력 (덱 비어 있는 경우 에러 발생)
 removeLast()  덱의 맨 뒤의 값 제거하고 출력 ( 비어 있는 경우 에러 발생) 

 *            :  코드 구현에 사용된 것

offer / offerLast      →       {deque}             poll / pollFirst
 pollLast                {deque}       ←     offerFirst

 

 

 [코드]

import java.util.*;
import java.io.*;
public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Deque<Integer> q = new LinkedList<>(); 
        int N =Integer.parseInt(br.readLine());
        while(N -->0){
           StringTokenizer st = new StringTokenizer(br.readLine()," ");
           
            switch(st.nextToken()){
                case"push_front" :
                    q.offerFirst(Integer.parseInt(st.nextToken()));
                    break;
                    
               case"push_back" : 
                    q.offerLast(Integer.parseInt(st.nextToken()));
                    break;
                    
                case "pop_front" :
                    if(q.isEmpty())
                        bw.write(-1+"\n");
                    else
                        bw.write(q.pollFirst()+"\n");
                    break;
                    
                case "pop_back" :
                    if(q.isEmpty())
                        bw.write(-1+"\n");
                    else
                        bw.write(q.pollLast()+"\n");
                    break;
                    
                case "size" :
                    bw.write(q.size()+"\n");
                    break;
                    
                case "empty" : 
                    if(q.isEmpty())
                        bw.write(1+"\n");
                    else
                        bw.write(0+"\n");
                    break;

                 case "front" : 
                    if(q.isEmpty())
                        bw.write(-1+"\n");
                    else
                        bw.write(q.peek()+"\n");
                    break;
                        
                 case "back" : 
                    if(q.isEmpty())
                        bw.write(-1+"\n");
                    else
                        bw.write(q.peekLast()+"\n");
                    break;
            }
        }
        bw.flush();
    }
}

 

 [해설]

 :  Deque<Integer> q = new LinkedList<>();  덱선언

 :  int N =Integer.parseInt(br.readLine());  첫쨰줄에 명령어 개수 입력받기

 :  StringTokenizer st = new StringTokenizer(br.readLine()," ");  문자열을 " "을 기준으로 구분

 :  switch(st.nextToken()){
                case"push_front" :  헷갈릴 것 없이 front면 first, back이면 Last 따라가면 돼
                 q.offerFirst(Integer.parseInt(st.nextToken())); 
                 break;
                    
                case"push_back" : 
                 q.offerLast(Integer.parseInt(st.nextToken()));
                 break;
                    
                case "pop_front" :
                    if(q.isEmpty())
                        bw.write(-1+"\n");
                    else
                        bw.write(q.pollFirst()+"\n");
                    break;
                    
                case "pop_back" :
                    if(q.isEmpty())
                        bw.write(-1+"\n");
                    else
                        bw.write(q.pollLast()+"\n");
                    break;
                    

 

 

이제 풀어보러 갈께요 :)

 

 

 

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

 

10866번: 덱

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

www.acmicpc.net

 

 

* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *