ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 10845 큐 -Java
    알고리즘 문제 풀이 2024. 4. 25. 15:39

    문제 - 큐

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

     

    10845번: 큐

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

    www.acmicpc.net

     

    문제 설명

     

    입력

     

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

     

    출력

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

     

     

    예제 입력

    15
    push 1
    push 2
    front
    back
    size
    empty
    pop
    pop
    pop
    size
    empty
    pop
    push 3
    empty
    front

     

     

    예제 출력

    1
    2
    2
    0
    1
    2
    -1
    0
    1
    -1
    0
    3

     

    접근 방법

     

    - 문제와 문제 제목을 보면 Queue를 사용하라는게 보인다

    - 하지만 어떤 큐를 사용할지 생각을 해봤을때 일단 우선 순위 큐는 아니다 

    - 명령은 push, pop, size, empty, front, back 이 있다 

    - 다른 사람들의 풀이를 보면 그냥 구현체로 LinkedList를 사용하지만 나는 저 back 이라는 명령어 때문에 deque를 사용한다고 생각한다 왜냐하면 그냥 일반 Queue는 선입 선출로 앞에 나올 것들만 출력할수 있다 하지만 deque는 앞에서도 뺄수 있고 뒤에서도 뺄수 있고 확인도 마찬가지다 이러한 이유로 deque를 사용하면 좀 더 편하고 효율적으로 문제를 풀수 있다고 본다


    코드 작성

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.ArrayDeque;
    import java.util.Deque;
    import java.util.Objects;
    import java.util.StringTokenizer;
    
    public class Main {
        public static void main(String[] args) throws IOException {
    
            try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
                int N = Integer.parseInt(br.readLine());
    
                Deque<Integer> deque = new ArrayDeque<>();
    
                for (int i = 0; i < N; i++) {
                    StringTokenizer st = new StringTokenizer(br.readLine());
                    String command = st.nextToken();
                    if (Objects.equals(command, "push")) {
                        int number = Integer.parseInt(st.nextToken());
                        deque.offer(number);
                    } else if (Objects.equals(command, "front")) {
                        if (deque.isEmpty()) {
                            bw.write(-1 + "\n");
                        } else {
                            bw.write(deque.peekFirst() + "\n");
                        }
    
                    } else if (Objects.equals(command, "back")) {
                        if (deque.isEmpty()) {
                            bw.write(-1 + "\n");
                        } else {
                            bw.write(deque.peekLast() + "\n");
                        }
                    } else if (Objects.equals(command, "size")) {
                        bw.write(deque.size() + "\n");
                    } else if (Objects.equals(command, "empty")) {
                        if (deque.isEmpty()) {
                            bw.write(1 + "\n");
                        } else {
                            bw.write(0 + "\n");
                        }
                    } else if (Objects.equals(command, "pop")) {
                        if (deque.isEmpty()) {
                            bw.write(-1 + "\n");
                        } else {
                            bw.write(deque.pollFirst() + "\n");
                        }
                    }
                }
                bw.flush();
            }
        }
    }

     


    풀고 느낀점

     

    - 코드를 보면 switch 문을 안쓰고 if-else 문을 사용하고 있다 이 이유는 단지 작자가 switch문을 싫어 해서 안쓴다

    - 하지만 이렇게 코드의 최적화를 위해서는 switch 문을 사용하는 것이 적절하다고 한다

    - queue 에서도 구현체가 여러가지가 있으니 생각하면서 자신이 맞다고 생각하는 자료구조를 선택해서 푸는 것이 중요하고 좋다고 한다

        -> 하지만 이유가 있어야함

    - 자료구조를 잘 알고 그 문제에 맞게 적절하게 풀어야 겠다

    '알고리즘 문제 풀이' 카테고리의 다른 글

    [백준] 5430 AC - Java  (0) 2024.04.28
    [백준] 1158 요세푸스 문제 - Java  (0) 2024.04.27
    [백준] 1966 프린터 큐 - Java  (0) 2024.04.25
    [백준] 2161 카드1 - Java  (0) 2024.04.24
    [백준] 2470 두 용액 - Java  (0) 2024.04.22
Designed by Tistory.