[BOJ] 10866 - 덱(Java)

EunBeen Noh·2024년 2월 19일

Algorithm

목록 보기
18/52

알고리즘

  • 구현
  • 자료 구조

1. 문제

2. Idea

  • 덱 자료구조를 통해 addFirst, addLast 메소드를 사용
  • 각 연산에 대한 switch-case문을 사용
  • 처음 시도에 Scanner를 사용 -> 속도 이슈 발생
  • BufferReader를 사용하여 해결

3. 풀이

3.1. 입력 및 초기화

  • BufferedReader, StringBuilder를 사용
  • 정수를 저장한 Deque 선언 및 초기화
  • StringTokenizer를 사용하여 공백을 기준으로 입력 parsing
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
Deque<Integer> deq = new ArrayDeque<Integer>();
		
for(int i = 0; i < N; i++) {
	StringTokenizer st = new StringTokenizer(br.readLine());
	String S = st.nextToken();

3.2. 명령어들에 대한 switch-case문 작성 및 처리

  • push_front X: 덱의 맨 앞에 정수 X 추가
  • push_back X: 덱의 맨 뒤에 정수 X 추가
  • pop_front: 덱의 맨 앞에 있는 정수를 꺼내고 출력. 만약 덱이 비어있다면 -1 출력
  • pop_back: 덱의 맨 뒤에 있는 정수를 꺼내고 출력. 만약 덱이 비어있다면 -1 출력
  • size: 덱에 들어있는 정수의 개수 출력
  • empty: 덱이 비어있으면 1, 그렇지 않으면 0 출력
  • front: 덱의 맨 앞에 있는 정수를 출력. 만약 덱이 비어있다면 -1 출력
  • back: 덱의 맨 뒤에 있는 정수를 출력. 만약 덱이 비어있다면 -1 출력
switch (S) {
	case "push_front" :
		deq.addFirst(Integer.parseInt(st.nextToken()));
		break;
	case "push_back" :
		deq.addLast(Integer.parseInt(st.nextToken()));
		break;
	case "pop_front" :
		if(deq.isEmpty()) sb.append(-1).append("\n");
		else sb.append(deq.pollFirst()).append("\n");
		break;
	case "pop_back" :
		if(deq.isEmpty()) sb.append(-1).append("\n");
		else sb.append(deq.pollLast()).append("\n");
		break;
	case "size" :
		sb.append(deq.size()).append("\n");
		break;
	case "empty" :
		if(deq.isEmpty()) sb.append(1).append("\n");
		else sb.append(0).append("\n");
		break;
	case "front" :
		if(deq.isEmpty()) sb.append(-1).append("\n");
		else sb.append(deq.peekFirst()).append("\n");
		break;
	case "back" :
		if(deq.isEmpty()) sb.append(-1).append("\n");
		else sb.append(deq.peekLast()).append("\n");
		break;
}

3.3. 결과 출력

  • 각 명령어에 대한 결과를 StringBuilder에 누적하고, 마지막에 한꺼번에 출력
System.out.println(sb);

4. 전체코드

import java.io.*;
import java.util.*;

public class Main {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		StringBuilder sb = new StringBuilder();
		Deque<Integer> deq = new ArrayDeque<Integer>();
		
		for(int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			String S = st.nextToken();
			
			switch (S) {
			case "push_front" :
				deq.addFirst(Integer.parseInt(st.nextToken()));
				break;
			case "push_back" :
				deq.addLast(Integer.parseInt(st.nextToken()));
				break;
			case "pop_front" :
				if(deq.isEmpty()) sb.append(-1).append("\n");
				else sb.append(deq.pollFirst()).append("\n");
				break;
			case "pop_back" :
				if(deq.isEmpty()) sb.append(-1).append("\n");
				else sb.append(deq.pollLast()).append("\n");
				break;
			case "size" :
				sb.append(deq.size()).append("\n");
				break;
			case "empty" :
				if(deq.isEmpty()) sb.append(1).append("\n");
				else sb.append(0).append("\n");
				break;
			case "front" :
				if(deq.isEmpty()) sb.append(-1).append("\n");
				else sb.append(deq.peekFirst()).append("\n");
				break;
			case "back" :
				if(deq.isEmpty()) sb.append(-1).append("\n");
				else sb.append(deq.peekLast()).append("\n");
				break;
			}
		}
		System.out.println(sb);
	}

}

0개의 댓글