본문 바로가기
백준

[백준] 단계별로 풀어보기(단계:19,큐/덱,JAVA)10866번, 덱

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

문제 링크

10866번: 덱
 
www.acmicpc.net

주의사항

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

문제 설명


접근 방법

기본적으로 덱은 큐(FIFO), 스택(LIFO)처럼 나오는 순서가 한 곳으로 한정된 것이 아닌 양방향에서 출력할 수 있는 자료구조입니다. 그래서 스택으로 사용할 수도 있고 큐로 사용할 수 있는 자료구조입니다.

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

1. 3을 덱에 넣었을 때

3

2. 2을 덱에 넣었을 때

3 2

3. 1을 덱에 넣었을 때

3 2 1

4. 덱에서는 자료를 출력할 때 First인지 Last인지 정할 수 있습니다.

First인 경우

3 2 1

Last인 경우

3 2 1

5. 결과

First인 경우

2 1

Last인 경우

3 2

위에 표를 보면서 덱은 First와 Last를 구분하여 저장 및 출력할 수 있습니다.

Java에서 덱를 표현하려면 ArrayDeque<>()로 선언해주어야 하므로 덱을 선언해주었습니다.

문제에서는 push_front, push_back, pop_front, pop_back, size, empty, front, back을 구현하도록 되어있습니다.

push_front : Deque.addFirst를 사용하여 구현하였습니다.

push_back : Deque.addLast를 사용하여 구현하였습니다.

pop_front : Deque.pollFirst을 사용하여 구현하였습니다.

pop_back : Deque.pollLast을 사용하여 구현하였습니다.

size : Deque.size을 사용하여 구현하였습니다.

empty : Deque.isEmpty을 사용하여 구현하였습니다.

front : Deque.peekFirst을 사용하여 구현하였습니다.

back : Deque.peekLast을 사용하여 구현하였습니다.

  • BufferedReader를 사용하여 입력 값을 받았습니다.
  • StringTokenizer를 통해서 명령어와 값을 띄어쓰기 기준으로 나누었습니다.
  • if문을 통해서 명령어에 해당하는 함수를 실행하도록 하였습니다.
  • push_front/push_bakc/pop_front/pop_back/size/empty/front/back 함수를 만들었습니다.
  • StringBuilder에 저장된 결과값을 System.out.println을 사용하여 출력하였습니다.
  • push/pop/size/empty/front/back 함수들은 모두  위에서 설명한 내용 그대로 구현하였습니다.

 

결과 코드

import java.io.*;
import java.util.*;
public class Main{
	static Deque<Integer> deque = new ArrayDeque<>();	//문제에 사용할 덱
	static StringBuilder sb = new StringBuilder();	//결과 저장할 StringBuilder
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//입력 값을 받는 BufferedReader
        	//--------입력값 저장 및 if문을 통한 함수 실행-------
		int index = Integer.parseInt(br.readLine());
		StringTokenizer st;
		for(int i=0;i<index;i++) {
			st = new StringTokenizer(br.readLine()," ");
			String text = st.nextToken();
			if(text.equals("push_front")) {
				int n = Integer.parseInt(st.nextToken());
				push_front(n);
			}else if(text.equals("push_back")) {
				int n = Integer.parseInt(st.nextToken());
				push_back(n);
			}else if(text.equals("pop_front"))
				pop_front();
			else if(text.equals("pop_back"))
				pop_back();
			else if(text.equals("size"))
				size();
			else if(text.equals("empty"))
				empty();
			else if(text.equals("front"))
				front();
			else if(text.equals("back"))
				back();
		}
		System.out.println(sb.toString());	//결과 출력
		br.close();
	}
    	//------push_front 함수----------
	public static void push_front(int n) {
		deque.addFirst(n);
	}
    	//------push_back 함수----------
	public static void push_back(int n) {
		deque.addLast(n);
	}
    	//------pop_front 함수----------
	public static void pop_front() {
		if(deque.isEmpty()) {
			sb.append("-1\n");
			return;
		}
		sb.append(deque.pollFirst() + "\n");
	}
    	//------pop_back 함수----------
	public static void pop_back() {
		if(deque.isEmpty()) {
			sb.append("-1\n");
			return;
		}
		sb.append(deque.pollLast() + "\n");
	}
    	//------size 함수----------
	public static void size() {
		sb.append(deque.size() + "\n");
	}
    	//------empty 함수----------
	public static void empty() {
		if(deque.isEmpty())
			sb.append("1\n");
		else
			sb.append("0\n");
	}
    	//------front 함수----------
	public static void front() {
		if(deque.isEmpty()) {
			sb.append("-1\n");
			return;
		}
		sb.append(deque.peekFirst() + "\n");
	}
    	//------back 함수----------
	public static void back() {
		if(deque.isEmpty()) {
			sb.append("-1\n");
			return;
		}
		sb.append(deque.peekLast() + "\n");
	}
}

댓글