[Java]자바로 구현하는 절댓값 우선순위 큐

1. 문제

 

배열에 다음과 같은 연산을 할 수 있습니다.

  1. 배열에 정수 x (x ≠ 0) 를 넣습니다.
  2. 배열에서 절댓값이 가장 작은 값을 출력하고, 그 값을 배열에서 제거합니다. ( 절댓값이 가장 작은 값이 여러개일 때는, 그 중 가장 작은 수를 출력하고, 그 값을 배열에서 제거합니다. )

비어있는 배열에서 시작하여 입력된 연산을 실행하는 프로그램을 작성해보세요.

 

 

2. 풀이

 

자바하면 클래스

 

어렵게 생각하지 말고 필요하다면 클래스를 구현해서 사용하라

 

절댓값을 만드는 클래스를 구현해야하는데,

 

문제는 절댓값을 기준으로 오름차순 정렬을 할 수 있어야하고 중요한건 절댓값만 저장하는게 아니라 원본도 저장해야한다.

 

그래야 우선순위 큐에서 출력할때 원본값을 출력할 수 있으니까

 

import java.util.Scanner;
import java.util.PriorityQueue;

class Abs implements Comparable<Abs>{

    int x,y;

    public Abs(int x){
        if (x < 0){
            this.x = -x;
        } else {
            this.x = x;
        }

        this.y = x;
    }

    @Override
    public int compareTo(Abs a){
        if (this.x == a.x){
            return this.y - a.y;
        }
        return this.x - a.x;
    }
}

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        PriorityQueue<Abs> pq = new PriorityQueue<>();

        for(int i = 0; i < n; i++){
            int x = sc.nextInt();

            if(x != 0){
                pq.add(new Abs(x));
            } else {

                if(pq.isEmpty() == true){
                    System.out.println(0);
                } else {
                Abs a = pq.poll();

                System.out.println(a.y);
                }
            }
        }
    }
}

 

그 외에 사소한거지만 신경써야하는거라면.. "pq.isEmpty()로 비어있는지 확인하고 비어있으면 0을 출력"

 

"정렬기준 구현할때, 절댓값이 서로 같다면 원본값을 기준으로 오름차순하라는거"

TAGS.

Comments