[알고리즘/백준] 18258번 : 큐2

2025. 4. 20. 19:55·Programming/Algorithm
문제 18258번 : 큐2
문제링크 https://www.acmicpc.net/problem/18258
난이도 S4
언어 Java
분류 자료구조 | 자료구조, 큐

 

 

📌 최종 정답 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 입력 - 명령의 수
        int n = Integer.parseInt(br.readLine());

        // 큐
        LinkedList<Integer> queue = new LinkedList<>();

        // 명령의 수 만큼 반복
        for(int i =0; i < n; i++){
            // 입력하는 명령어
            String[] inputs = br.readLine().split(" ");

            switch (inputs[0]) {
                case "push" :
                    int value = Integer.parseInt(inputs[1]);
                    queue.add(value);
                    break;
                case "pop" :
                    if(queue.isEmpty()){
                        // 비어있을 경우
                        bw.write("-1" + "\n");
                    } else {
                        bw.write(queue.poll() + "\n");
                    }
                    break;
                case "size" :
                    bw.write(queue.size() + "\n");
                    break;
                case "empty" :
                    if(queue.isEmpty()){
                        // 비어있을 경우
                        bw.write("1" + "\n");
                    } else {
                        bw.write("0" + "\n");
                    }
                    break;
                case "front" :
                    if(queue.isEmpty()){
                        // 비어있을 경우
                        bw.write("-1" + "\n");
                    } else {
                        bw.write(queue.peek() + "\n");
                    }
                    break;
                case "back" :
                    if(queue.isEmpty()){
                        // 비어있을 경우
                        bw.write("-1" + "\n");
                    } else {
                        bw.write(queue.get(queue.size()-1)+ "\n");
                    }
                    break;
            }

        }

        bw.flush();
        bw.close();
    }
}


📌 구해야 하는 정답

명령어에 대한 결과

  • push X: 큐에 x 넣기
  • pop: 큐의 가장 앞의 정수를 빼서 출력, 없을 경우 -1 출력
  • size: 큐에 있는 정수의 개수를 출력
  • empty: 큐가 비어있으면 1, 아니면 0을 출력
  • front: 큐의 가장 앞에 있는 정수를 출력, 없을 경우 -1 출력
  • back: 큐의 가장 뒤에 있는 정수를 출력, 없을 경우 -1 출력


📌 풀이하기

1. 입력받기

// 입력 - 명령의 수
int n = Integer.parseInt(br.readLine());

// 입력하는 명령어 종류
String[] inputs = br.readLine().split(" ");

 

2. 큐 계산 & 결과 출력

for(int i =0; i < n; i++){
    // 입력하는 명령어
    String[] inputs = br.readLine().split(" ");

    switch (inputs[0]) {
        case "push" :
            int value = Integer.parseInt(inputs[1]);
            queue.add(value);
            break;
        case "pop" :
            if(queue.isEmpty()){
                // 비어있을 경우
                bw.write("-1" + "\n");
            } else {
                bw.write(queue.poll() + "\n");
            }
            break;
        case "size" :
            bw.write(queue.size() + "\n");
            break;
        case "empty" :
            if(queue.isEmpty()){
                // 비어있을 경우
                bw.write("1" + "\n");
            } else {
                bw.write("0" + "\n");
            }
            break;
        case "front" :
            if(queue.isEmpty()){
                // 비어있을 경우
                bw.write("-1" + "\n");
            } else {
                bw.write(queue.peek() + "\n");
            }
            break;
        case "back" :
            if(queue.isEmpty()){
                // 비어있을 경우
                bw.write("-1" + "\n");
            } else {
                bw.write(queue.get(queue.size()-1)+ "\n");
            }
            break;
    }
}

 

초반에는 다음처럼 ArrayList를 이용하여 풀이하였는데 메모리 초과로 LinkedList 방식으로 변경하여 풀이하였다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class Main {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 입력 - 명령의 수
        int n = Integer.parseInt(br.readLine());

        // 큐
        ArrayList<Integer> queue = new ArrayList<Integer>(n);

        // 명령의 수 만큼 반복
        for(int i =0; i < n; i++){
            // 입력하는 명령어
            String[] inputs = br.readLine().split(" ");

            switch (inputs[0]) {
                case "push" :
                    int value = Integer.parseInt(inputs[1]);
                    queue.add(value);
                    break;
                case "pop" :
                    if(queue.isEmpty()){
                        // 비어있을 경우
                        bw.write("-1" + "\n");
                    } else {
                        bw.write(queue.get(0) + "\n");
                        queue.remove(0);
                        for(int j = 0; j < queue.size()-1; j ++){
                            queue.add(j, queue.get(j+1));
                        }
                    }
                    break;
                case "size" :
                    bw.write(queue.size() + "\n");
                    break;
                case "empty" :
                    if(queue.isEmpty()){
                        // 비어있을 경우
                        bw.write("1" + "\n");
                    } else {
                        bw.write("0" + "\n");
                    }
                    break;
                case "front" :
                    if(queue.isEmpty()){
                        // 비어있을 경우
                        bw.write("-1" + "\n");
                    } else {
                        bw.write(queue.get(0) + "\n");
                    }
                    break;
                case "back" :
                    if(queue.isEmpty()){
                        // 비어있을 경우
                        bw.write("-1" + "\n");
                    } else {
                        bw.write(queue.get(queue.size() -1) + "\n");
                    }
                    break;
            }

        }

        bw.flush();
        bw.close();
    }
}

 

LinkedList는 처음 사용하여 메서드를 검색하여 풀었다.

 

pop할 때 .poll()를 하면 가장 앞의 수가 빠지면서 출력되는 게 신기했다.

가장 앞의 수를 출력만 할 때는 get(0)을 해도 되고, peek()를 해도 된다.

 

📌 코드 설계하기

  1. 명령어의 개수를 입력 받습니다.
  2. 큐를 위한 변수를 선언합니다.
  3. 명령어를 공백을 기준으로 parsing 합니다.
  4. push 명령어 구현
  5. pop 명령어 구현
  6. size 명령어 구현
  7. empty 명령어 구현
  8. front 명령어 구현
  9. back 명령어 구현

 

📌 시간 복잡도

각 명령어의 시간복잡도는 각 항목에서 확인하실 수 있습니다.

추가로 큐 자료구조의 대표적인 연산들의 시간복잡도는 아래와 같습니다.

 

 

'Programming > Algorithm' 카테고리의 다른 글

[알고리즘/백준] 7785번 : 회사에 있는 사람(Java)  (1) 2025.04.22
[알고리즘/백준] 28279번 : 덱2(Java)  (1) 2025.04.21
[알고리즘/백준] 10828번 : 스택  (1) 2025.04.19
[알고리즘/백준] 2231번 : 분해합(Java)  (1) 2025.04.18
[알고리즘/백준] 2798번 : 블랙잭(Java)  (1) 2025.04.17
'Programming/Algorithm' 카테고리의 다른 글
  • [알고리즘/백준] 7785번 : 회사에 있는 사람(Java)
  • [알고리즘/백준] 28279번 : 덱2(Java)
  • [알고리즘/백준] 10828번 : 스택
  • [알고리즘/백준] 2231번 : 분해합(Java)
min_sol
min_sol
  • min_sol
    비글개발연구소🐾
    min_sol
  • 전체
    오늘
    어제
    • 분류 전체보기 (278)
      • Programming (128)
        • Algorithm (52)
        • JAVA (40)
        • GIS (5)
        • PyQt (10)
        • C# (11)
        • Mobile (6)
        • AI (4)
      • Backend (36)
        • Spring (14)
        • JSP (11)
        • Network (5)
      • Frontend (29)
        • React (11)
        • Vue (13)
        • Next.js (4)
      • Database (10)
        • PostgreSQL (1)
        • Oracle (8)
        • Elasticsearch (1)
      • DevOps (8)
        • Linux (7)
        • Mac (1)
      • Tools (31)
        • IntelliJ (1)
        • GitHub (10)
        • RPA (20)
      • Security (9)
      • etc (21)
        • ERROR (5)
        • 세미나 | 교육 (10)
        • 자격증 (1)
        • 일상 (2)
        • 2021 (2)
  • 인기 글

  • 태그

    명품자바에센셜
    자동화
    코딩테스트
    자료구조
    알고리즘
    spring
    PyQt5
    RPA
    PyQt
    연습문제
    스윙
    vue.js
    자바
    계산기
    백준
    생능출판
    Java
    이클립스
    jsp
    VUE
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
min_sol
[알고리즘/백준] 18258번 : 큐2
상단으로

티스토리툴바