본문 바로가기
백준

[백준] 10845번 : 큐 – JAVA [자바]

by Hongwoo 2022. 7. 26.
반응형

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

 

10845번: 큐

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

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 10845번 큐는 실버 4 난이도의 자료 구조 및 큐 문제이다. 이 문제는 간단히 문제에 나와있는 명령어 6개를 구현하면 된다. 만약 큐에 대해 공부하고 싶으면 밑에 있는 링크를 참고하면 되겠다.

 

https://propercoding.tistory.com/18

 

[자료구조] 큐(Queue)

목차 큐(Queue)의 개념 큐는 FIFO 선입선출(First In First Out)의 구조를 가진다. 즉, 큐에서는 먼저 들어온 데이터가 가장 먼저 나가는 구조이다. 한 예는 은행에 번호표가 있다. 은행에서 번호표를 먼

propercoding.tistory.com

 

우선 이 문제에 나와있는 6개의 명령어를 각각 메서드로 만들 것이다. 이 이유는 각각의 명령어를 메서드로 만들면 구독성이 더 뛰어나기 때문이다. 그리고 메인 함수에서 입력을 받고 각각의 함수를 실행하는 식으로 구현할 것이다.

 

그리고 이 문제에서 쓸 큐와 StringBuilder는 메인 메서드가 아니라 클래스에 static 변수로 선언할 것이다. 이 이유는 메인 함수에서만 큐와 StringBuilder를 쓰는 게 아니라 다른 메서드들에서도 사용할 것이기 때문에 클래스 변수로 선언해 줄 것이다.

 

이제 각각의 명령어를 구현해 보겠다.

 

1. push X

push X는 정수 X를 큐에 넣는 연산이다. 간단히 push 메서드에 매개 변수로 int X를 받는 걸로 하고 큐에 추가해주기만 하면 된다.

 

2. pop

pop은 큐가 비어있으면 -1을 출력하고, 아니면 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력하는 연산이다. 즉, pop 메서드를 만들고 큐가 비어있는지 아닌지는 q.isEmpty() 함수로 확인한다. 비어있으면 -1을 출력하고, 아니면 q.remove()한 값을 출력하면 된다.

 

3. size

size는 큐에 들어있는 정수의 개수를 출력한다. 이 함수는 간단하다. q.size()를 출력해주면 된다.

 

4. empty

empty는 큐가 비어있는지 아닌지만 확인해주면 되는 함수이다. 큐가 비어있으면 1, 아니면 0을 출력하면 된다. 

 

5. front

front는 큐가 비어있으면 -1을 출력하고, 아니면 큐의 가장 앞에 있는 정수를 출력하면 된다. 마찬가지로 q.isEmpty()로 큐가 비어있는지 아닌지를 확인하고 q.peek()한 값을 출력하면 된다.

 

6. back

back은 큐가 비어있으면 -1을 출력하고 아니면 큐의 가장 뒤에 있는 정수를 출력하면 된다. 이 함수도 마찬가지로 q.isEmprt()를 써서 큐가 비었는지 아닌지를 확인하면 된다. 하지만, 큐에는 마지막에 있는 값을 확인하는 메서드가 없다. 따라서 이 함수는 직접 구현을 해줘야 한다.

 

이 함수는 큐의 특성인 선입선출을 이용해서 구현하면 된다. 큐는 먼저 추가한 값이 먼저 제거된다. 따라서 큐에 n개의 숫자가 있으면 n - 1개의 숫자들을 제거하고 바로 다시 넣어준 다음에 첫 번째 숫자를 q.peek()을 이용해서 출력해주면 된다.

 

자세한 코드는 밑에 있는 코드를 참고해주면 되겠다.

 


  • 코드

 

import java.io.*;
import java.util.*;
public class Main {
    static Queue<Integer> q;
    static StringBuilder sb;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        q = new LinkedList<>();
        StringTokenizer st;
        sb = new StringBuilder();
        String s;
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            s = st.nextToken();
            if (s.equals("push")) push(Integer.parseInt(st.nextToken()));
            if (s.equals("pop")) pop();
            if (s.equals("size")) size();
            if (s.equals("empty")) empty();
            if (s.equals("front")) front();
            if (s.equals("back")) back();
        }
        System.out.print(sb);
    }

    //큐에 x 삽입
    static void push(int x) {
        q.add(x);
    }

    //큐 첫번째 숫자 빼내기
    static void pop() {
        if (q.isEmpty()) {
            sb.append("-1\n");
        } else {
            sb.append(q.remove() + "\n");
        }
    }

    //큐 사이즈 출력
    static void size() {
        sb.append(q.size() + "\n");
    }

    //큐가 비어있으면 1, 비어있지 않으면 0 출력
    static void empty() {
        if (q.isEmpty()) {
            sb.append("1\n");
        } else {
            sb.append("0\n");
        }
    }

    //큐가 비어있으면 -1 출력. 비어있지 않으면 첫번째 숫자 출력
    static void front() {
        if (q.isEmpty()) {
            sb.append("-1\n");
        } else {
            sb.append(q.peek() + "\n");
        }
    }

    //큐가 비어있으면 -1 출력. 비어있지 않으면 마지막 숫자 출력
    static void back() {
        if (q.isEmpty()) {
            sb.append("-1\n");
            return;
        }
        int n = q.size();
        for (int i = 1; i <= n - 1; i++) {
            q.add(q.remove());
        }
        sb.append(q.peek() + "\n");
        q.add(q.remove());
    }
}

 

 

반응형

댓글