[코딩테스트] 백준 11286 자바

Henson·2025년 5월 17일

코딩테스트

목록 보기
9/50
post-thumbnail

백준 11286

백준 11286 문제

import java.util.*;

public class Boj11286 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 연산 횟수
        // 우선순위 큐 사용, 조건에 맞게 정렬하도록 Comparator를 람다로 전달
        PriorityQueue<Integer> queue = new PriorityQueue<>((n1, n2) -> {
            // 절대값 작은 데이터 우선
            int firstAbs = Math.abs(n1);
            int secondAbs = Math.abs(n2);
            // 절대값이 같은 경우 음수 우선
            if (firstAbs == secondAbs) {
                return n1 > n2 ? 1 : -1;
            }
            return firstAbs - secondAbs;
        });

        for (int i = 0; i < n; i++) {
            int request = sc.nextInt(); // 입력된 값을 받는다
            if (request == 0) { // 입력된 값이 0이고
                if (queue.isEmpty()) { // 우선순위큐가 비어있다면
                    System.out.println(0); // 0을 출력
                } else { // 우선순위큐가 비어있지 않다면
                    System.out.println(queue.poll()); // 정렬된 우선순위 큐의 값을 poll()하여 출력
                }
            } else { // 입력된 값이 0이 아니면
                queue.add(request); // 우선순위큐에 입력된 값 삽입
            }
        }
    }
}

풀이

  1. 해당 문제는 우선순위 큐의 비교자를 수정하여 조건에 맞는 우선순위 큐를 구현할 수 있으면 해결할 수 있는 문제이다.
  2. Scanner를 통해 연산 횟수 n를 받는다.
  3. 우선순위 큐를 생성하는데 매개변수로 Comparator 람다를 전달한다.
  4. Comparator는 입력 받은 두 수의 절대값을 구하고, 만약 두 절대값이 같다면, 원래의 두 수를 비교하여, 첫 번째 수가 크면 1를 두 번째 수가 크면 -1 반환한다.
  5. 두 절대값 수가 다르다면, firstAbs - secondAbs를 하여 첫 번째 수가 크면 양수를 두 번째 수가 크면 음수를 반환하게 한다.
  6. 이제 n만큼 반복을 하면서 입력된 수를 받아 request에 넣어준다.
  7. request0이면 우선순위 큐가 비어있는지 확인하고, 비어 있으면 0을 출력한다.
  8. 우선순위 큐가 비어있지 않다면, poll()를 통해 정렬된 가장 앞의 수를 출력한다.
  9. request0이 아니면 입력된 수를 우선순위 큐에 넣는다.
profile
세계 최고의 개발자가 되고 말겠어.

0개의 댓글