sm 기술 블로그
184. 11286(절댓값 힙) - 자바 본문
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
간단히 말해 객체를 비교하기 위해 사용하는 것으로,
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에 저장을 해주고 마지막에 출력을 해준다.
'문제 > 백준_자바' 카테고리의 다른 글
186. 11066(파일 합치기) - 자바 (0) | 2022.08.25 |
---|---|
185. 1655(가운데를 말해요) - 자바 (0) | 2022.08.23 |
183. 1927(최소 힙) - 자바 (0) | 2022.08.22 |
182. 11279(최대 힙) - 자바 (0) | 2022.08.21 |
181. 12015(가장 긴 증가하는 부분 수열2) - 자바 (0) | 2022.08.21 |
Comments