[백준] 28279. 덱 2

진예·2023년 11월 1일
0

Baekjoon : JAVA

목록 보기
57/76
post-thumbnail
post-custom-banner

📌 문제

[28279] 덱 2

정수를 저장하는 을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여덟 가지이다.

  • 1 X : 정수 X를 덱의 앞에 넣는다. (1 ≤ X ≤ 100,000)
  • 2 X : 정수 X를 덱의 뒤에 넣는다. (1 ≤ X ≤ 100,000)
  • 3 : 덱에 정수가 있다면 맨 앞의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
  • 4 : 덱에 정수가 있다면 맨 뒤의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
  • 5 : 덱에 들어있는 정수의 개수를 출력한다.
  • 6 : 덱이 비어있으면 1, 아니면 0을 출력한다.
  • 7 : 덱에 정수가 있다면 맨 앞의 정수를 출력한다. 없다면 -1을 대신 출력한다.
  • 8 : 덱에 정수가 있다면 맨 뒤의 정수를 출력한다. 없다면 -1을 대신 출력한다.

⬇️ 입력

첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)

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

출력을 요구하는 명령은 하나 이상 주어진다.

⬆️ 출력

출력을 요구하는 명령이 주어질 때마다 명령의 결과를 한 줄에 하나씩 출력한다.

💡 코드

덱(Dequeue)이란 선입선출, 후입선출 방식이 아닌 양방향으로 삽입, 삭제가 모두 가능한 자료구조이다. 선언 및 사용법이 와 비슷한데, 기본적으로 큐에서 사용하는 메서드앞쪽 값을 활용하면 First를, 뒤쪽 값을 활용하면 Last를 붙여주면 쉽게 활용할 수 있다.

이번 문제는 앞서 풀었던 스택 2, 큐 2같은 유형으로, switch ~ case문을 사용하여 각 명령어 order에 해당하는 작업을 수행하면 된다.

  • 1, 2 : 처리해야 할 명령어가 2개이므로 Stringtokenizer를 통해 전달받은 정수offer() 메서드를 사용하여 d에 넣는다. 두 명령어는 따로 출력을 요구하지 않으므로 값을 result에 저장할 필요는 없다.
    ➡️ 1 : offerFirst() (앞) / 2 : offerLast() (뒤)

  • 3, 4 : d비어어있으면 -1, 비어있지 않다면 poll() 메서드를 사용하여 값을 꺼낸 후 result에 저장한다.
    ➡️ 3 : pollFirst() (앞) / 4 : pollLast() (뒤)

  • 5 : size() 메서드를 사용하여 d에 저장된 정수의 개수result에 저장한다.

  • 6 : isEmpty() 메서드를 사용하여 d비어있으면 1, 비어있지 않으면 0result에 저장한다.

  • 7, 8 : d비어있으면 -1, 비어있지 않다면 peek() 메서드를 사용하여 result에 저장한다.
    ➡️ 7 : peekFirst() (앞) / 8 : peekLast() (뒤)

    조건 판별이 종료되면 result의 값이 초기값인 -2가 아닌 경우에만 결과값을 출력한다.
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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		
		Deque<Integer> d = new LinkedList<>();
		
		int n = Integer.parseInt(br.readLine());
		for(int i=0;i<n;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			String order = st.nextToken();
			
			int result = -2;
			switch(order) {
				case "1" : 
					d.offerFirst(Integer.parseInt(st.nextToken()));
					break;
					
				case "2" :
					d.offerLast(Integer.parseInt(st.nextToken()));
					break;
					
				case "3" : 
					if(d.isEmpty()) result = -1;
					else result = d.pollFirst();
					break;
				
				case "4" :
					if(d.isEmpty()) result = -1;
					else result = d.pollLast();
					break;
					
				case "5" : 
					result = d.size(); break;
					
				case "6" : 
					if(d.isEmpty()) result = 1;
					else result = 0;
					break;
					
				case "7" : 
					if(d.isEmpty()) result = -1;
					else result = d.peekFirst();
					break;
					
				case "8" : 
					if(d.isEmpty()) result = -1;
					else result = d.peekLast();
					break;
			}
			if(result != -2) sb.append(result).append("\n");
		}
		bw.write(sb + "");
		
		br.close();
		bw.close();
	}
}

profile
백엔드 개발자👩🏻‍💻가 되고 싶다
post-custom-banner

0개의 댓글