Study/Baekjoon

Baekjoon18258: 큐 2

devyoseph 2021. 10. 22. 20:11

문제

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

명령은 총 여섯 가지이다.

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

입력

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

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

 

풀이

 

배열을 사용?

배열을 이용해서 풀이가 가능한지 먼저 따져보았다.

[ 자료 1, 자료 2, 자료 3, ... , 자료 n, 빈 공간, 빈 공간, 빈 공간 ]

자료가 빈 공간에 새로 들어오는 것은 괜찮지만 자료 1을 pop하면 그 다음 과정이 조금 복잡해진다

경우 1 : 자료 1을 pop한 후 자료 2부터 모두 앞으로 당겨준다. ex) 자료 2 → 자료 1

경우 2 : 자료 2부터 위치는 냅두고 탐색하는 변수값을 +1 해준다. index[0] → index [1]

두 경우 모두 연산이 계속될수록 공간의 낭비가 발생한다.

 

Queue 클래스

직접 구현할 수 있지만 앞으로 큐와 관련된 복잡한 알고리즘을 풀이할 때마다 직접 구현할 수 없는 노릇!

Java에서 지원하는 Queue class를 사용하기로 했다. 관련 개념은 아래 링크를 참고하시길!

 

Java: 큐(Queue)의 개념과 사용법, 요세푸스 순열

큐 먼저 들어간 것이 먼저 나가는 구조 FIFO(First In First Out) 상황으로 이해한다 a라는 일을 하고 있는데 a가 끝나면 b를 하라는 지시가 왔다 a가 끝나지 않은 상황에서 할 일을 모두 마치면 c를 하라

devyoseph.tistory.com

 

Queue Class

import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
	 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     
	 StringBuilder sb = new StringBuilder();
     //스트링빌더를 통해 출력
     
	 Queue<Integer> queue = new LinkedList<>();
     
	 StringTokenizer st;
	 int first=0;
	 int N = Integer.parseInt(br.readLine());
	 while(N--> 0) {
     
		 st = new StringTokenizer(br.readLine()," ");
		 switch(st.nextToken()) {
         
		 case"push": first = Integer.parseInt(st.nextToken()); queue.add(first); break;
         //first 변수를 통해 back에 출력할 숫자를 기록한다
         
		 case"pop": sb.append(queue.isEmpty()?-1:queue.poll()).append("\n");break;
         //비어있는지 확인 후 poll()이나 remove()를 해준다
         
		 case"size": sb.append(queue.size()).append("\n");break;
         //size()는 어느 때나 사용할 수 있다
         
		 case"empty": sb.append(queue.isEmpty()?1:0).append("\n");break;
         
		 case"front":sb.append(queue.isEmpty()?-1:queue.peek()).append("\n");break;
         //front와 back이 헷갈릴 수 있다. front는 맨 처음 들어온, 출력 예정인 자료므로 peek()
         
		 case"back": sb.append(queue.isEmpty()?-1:first).append("\n");break;
         //Queue는 마지막에 집어넣은 숫자를 알려주는 메소드가 없다. add()할 때 기록해준다
         
		 }
	 }
     
	 System.out.print(sb.toString());
}}

'Study > Baekjoon' 카테고리의 다른 글

Baekjoon11866: 요세푸스 문제 0  (0) 2021.10.23
Baekjoon2164: 카드2  (0) 2021.10.23
Baekjoon4949: 균형잡힌 세상  (0) 2021.10.21
Baekjoon1874: 스택 수열  (0) 2021.10.21
Baekjoon17298: 오큰수  (0) 2021.10.21