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

[백준] 10845번 큐 JAVA (자바) 풀이

by Poorm 푸름 2023. 6. 22.

문제 10828번

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

 

 [명령]

  

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

 

 [입력]


 : 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)

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

 

 

 [출력]


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



 [큐]


 : 큐는 들어가는 문 하나 나가는 문 하나

 : 선입선출 (후입선출인 스택과는 조금 다르다 얘는 들어왔던 순서대로 나갈 수 있다)  

   예) 1 - 3 - 5 순서대로 push 하고 pop 하면 맨 처음에 들어온 1 나간다

 

 

 [큐 연산]

 

 init()  큐 초기화
 create()  큐 생성
 isEmpty()  큐 비어있는지 검사
 isFull()  큐 가득 찼는지 검사 
 enqueue(e)  큐 맨 뒤에 e 추가
 dequeue()  큐 맨 앞의 값 삭제 
 peek()  큐 맨 앞의 값 출력 (큐가 비어있는 경우 null 반환)
 element()  큐 맨 앞의 값 출력 (큐가 비어 있는 경우 에러 발생)
 offer(e)  큐의 맨 뒤에 e 추가 (큐가 비어있는 경우 null 반환)
 add(e)  큐의 맨 뒤에 e 추가(큐가 비어 있는 경우 에러 발생)
 poll()  큐의 맨 앞의 값 제거하고 출력 (큐가 비어있는 경우 null 반환)
 remove()  큐의 맨 앞의 값 제거하고 출력 (큐가 비어 있는 경우 에러 발생)

 *            :  코드 구현에 사용된 것

 

 

 [코드 수정 전]

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));
    
        int T = Integer.parseInt(br.readLine());
        Quque<Integer> que = new LinkedList<>();
        
        while(T-->0){
           String s = br.readLine();
           String spt[] = s.split(" ");
            switch(spt[0]){
                case "push":
                  que.offer(Integer.parseInt(spt[1]));
                break;
                    
                case "pop":
                  if(que.isEmpty())
                      bw.write(-1+"\n");
                  else
                      bw.write(que.poll()+"\n");
                break;
                
                case "size":
                      bw.write(que.size()+"\n");
                break;
                
                case "empty":
                  if(que.isEmpty())
                      bw.write(1+"\n");
                  else 
                      bw.write(0+"\n");
                break;
                
                case "front":
                  if(que.isEmpty())
                      bw.write(-1+"\n");
                  else 
                      bw.write(que.peek()+"\n");
                break;
            }
        }
        bw.flush();
    }
}

 

 [해설 1]

 :  int T = Integer.parseInt(br.readLine()); 첫줄에 명령수        

 :  Quque<Integer> que = new LinkedList<>(); 큐선언
        
 :  String s = br.readLine(); 둘째줄부터 입력받는 명령어
 
 :  String spt[] = s.split(" "); 공백으로 문자 구분하기 
           

 :  switch(spt[0]){ 는 if(s.contains())문으로 대신해도 좋다
               

 -  명령 대부분의 것들은 큐(Queue) 연산으로 바로 구현이 가능하다

    단, back 명령어를 바로 수행할 수 있는 연산이 없어서 직접 만들어줘야된다

    그렇게 되면 복잡하기 때문에 덱(Deque)으로 바꿔 구현하면 훨씬 더 편하다

    (덱의 peekLast라는 명령어를 쓰면 된다)

 

 

 [코드 수정 후]

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));
    
        int T = Integer.parseInt(br.readLine());
        Deque<Integer> que = new LinkedList<>(); //수정부분
        
        while(T-->0){
           String s = br.readLine();
           String spt[] = s.split(" ");
            switch(spt[0]){
                case "push":
                  que.offer(Integer.parseInt(spt[1]));
                break;
                    
                case "pop":
                  if(que.isEmpty())
                      bw.write(-1+"\n");
                  else
                      bw.write(que.poll()+"\n");
                break;
                
                case "size":
                      bw.write(que.size()+"\n");
                break;
                
                case "empty":
                  if(que.isEmpty())
                      bw.write(1+"\n");
                  else 
                      bw.write(0+"\n");
                break;
                
                case "front":
                  if(que.isEmpty())
                      bw.write(-1+"\n");
                  else 
                      bw.write(que.peek()+"\n");
                break;
                
                case "back":                //수정부분
                  if(que.isEmpty())
                      bw.write(-1+"\n");
                  else
                      bw.write(que.peekLast()+"\n");
                break;
            }
        }
        bw.flush();
    }
}

                                                         

 [해설 2]

 

 :  Quque<Integer> que = new LinkedList<>(); 를 Deque<Integer> que = new LinkedList<>(); 로 바꾼다

 

 :  bw.write(que.peekLast()+"\n"); 덱의 마지막 값을 출력하는 연산이 peekLast이다

 

 

 

이제 풀어보러 갈께요 :)

 

 

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

 

10845번: 큐

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

www.acmicpc.net

 

 

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