sm 기술 블로그

184. 11286(절댓값 힙) - 자바 본문

문제/백준_자바

184. 11286(절댓값 힙) - 자바

sm_hope 2022. 8. 22. 19:15
import java.util.*;
import java.io.*;

class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		StringBuilder sb = new StringBuilder();
		PriorityQueue<Integer> que = new PriorityQueue<>(new Comparator<Integer>() {
			public int compare(Integer i1, Integer i2) {
				// 절대값의 값이 같을 경우
				if (Math.abs(i1) == Math.abs(i2)) {
					return i1 - i2;
				} else {
					return Math.abs(i1) - Math.abs(i2);
				}
			}
		});

		for (int i = 0; i < N; i++) {
			int X = sc.nextInt();
			
			if(X == 0) {
				if(que.isEmpty()) {
					sb.append(0).append("\n");
				}
				else {
					sb.append(que.remove()).append("\n");
				}
			}
			
			else {
				que.add(X);
			}		
		}
		
		System.out.print(sb);

	}
}

문제요약

값을 입력하는데 0이면 현재 입력된 값 중에 절대값 기준 가장 작은 값을 출력하라.(절대값이 같다면 더 작은 값 출력)

설명

이 문제를 풀기 위해서 Comparable 과 Comparator를 알아야 한다.

https://st-lab.tistory.com/243

 

자바 [JAVA] - Comparable 과 Comparator의 이해

아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객

st-lab.tistory.com

간단히 말해 객체를 비교하기 위해 사용하는 것으로,

Comparable 은 자기 자신과 매개변수 객체를 비교하는 것이고, Comparator는 두 매개변수 객체를 비교 한다는 것이다.

 

		PriorityQueue<Integer> que = new PriorityQueue<>(new Comparator<Integer>() {
			public int compare(Integer i1, Integer i2) {
				// 절대값의 값이 같을 경우
				if (Math.abs(i1) == Math.abs(i2)) {
					return i1 - i2;
				} else {
					return Math.abs(i1) - Math.abs(i2);
				}
			}
		});

이 구문은 우리가 정렬 파트에서 정렬을 할 때 많이 사용했다.

Comparator를 선언하고 두개의 매개변수를 비교한다.

return 앞 - 뒤로 양수거나 0이면 앞이 음수이면 뒤가 반환된다.

 

절댓값이 같은 경우에는 절댓값의 값 중 둘 중 더 작은 것을 출력하기 때문에 if 문을 통해 비교를 해 주었고, 그게 아니면 절대값으로 비교하도록 해준다.

 

		for (int i = 0; i < N; i++) {
			int X = sc.nextInt();
			
			if(X == 0) {
				if(que.isEmpty()) {
					sb.append(0).append("\n");
				}
				else {
					sb.append(que.remove()).append("\n");
				}
			}
			
			else {
				que.add(X);
			}		
		}
		
		System.out.print(sb);

이 후에는 전의 문제들과 다르지 않으며, sb에 저장을 해주고 마지막에 출력을 해준다.

Comments