🔺 문제
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
🔺 코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
// 우선순위 큐 선언
PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> {
int first_abs = Math.abs(o1);
int second_abs = Math.abs(o2);
if(first_abs == second_abs)
return o1 > o2 ? 1 : -1; // 절댓값이 같다면 음수 우선출력
else
return first_abs - second_abs; // 절댓값 기준 정렬
});
for(int i = 0 ; i < n ; i++) {
int num = Integer.parseInt(br.readLine());
if(num == 0) {
if(pq.isEmpty())
sb.append("0").append("\n");
else
sb.append(pq.poll()).append("\n");
}
else {
pq.add(num);
}
}
System.out.println(sb.toString());
}
}
✅ 해결 아이디어
- 우선순위 큐 → 정렬 기준 새로 적용
💥 유의사항
⇨ Compare 함수 구현 시, return 값으로 양수를 주면 순서를 바꾸겠다는 의미.
⇨ 절댓값이 같은 경우, 그 중 작은 값으로 오름차순 정렬 / 아닌 경우 절댓값이 작은 순서로 오름차순 정렬
🔺 다른 풀이들
- 풀이1) Compare 오버라이드
[백준/BOJ] 11286번 : 절댓값 힙 (JAVA / 자바)
안녕하세요~ 코딩하는 코알못 코메인입니다. https://www.acmicpc.net/problem/11286 11286번: 절댓값 힙 첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는
comain.tistory.com
메소드 사용자 정의하실 때 오버라이드를 사용하셨다.
- 풀이2) 우선순위 큐 정의할 때 삼항식 사용!
[백준 - Java] 11286번 : 절댓값 힙
우선순위 큐 이용
velog.io
+ 복습용
[백준 11286번] 절댓값 힙 (JAVA)
백준 11286번 문제 - 절댓값 힙 11286번: 절댓값 힙 첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배
kyumq.tistory.com
💬 느낀 점
사용자 정의 정렬 방법!을 잊지 말자.
(+ 6/13 2회독)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> {
int abs1 = Math.abs(o1);
int abs2 = Math.abs(o2);
if(abs1 == abs2) { // 절댓값이 같으면 음수 우선 정렬
return o1 - o2;
} else {
return abs1 - abs2; // 절댓값 기준 정렬
}
});
while(N --> 0) {
int x = Integer.parseInt(br.readLine());
if(x == 0) {
if(pq.isEmpty()) {
sb.append(0).append("\n");
} else {
sb.append(pq.poll()).append("\n");
}
}
else {
pq.add(x);
}
}
System.out.print(sb);
}
}
|
cs |

(참고)
✔ 우선순위 큐 클래스 사용법
[Java] PriorityQueue(우선순위 큐) 클래스 사용법 & 예제 총정리
우선순위 큐(Priority Queue)란? 일반적으로 큐는 데이터를 일시적으로 쌓아두기 위한 자료구조로 스택과는 다르게 FIFO(First In First Out)의 구조 즉 먼저 들어온 데이터가 먼저 나가는 구조를 가집니다
coding-factory.tistory.com
+ 비슷한 문제
✔ 최소 힙
https://www.acmicpc.net/problem/1927
1927번: 최소 힙
첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
✔ 최대 힙
https://www.acmicpc.net/problem/11279
11279번: 최대 힙
첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 18258번: 큐 2 (0) | 2023.04.12 |
---|---|
[백준/JAVA] 9012번: 괄호 (0) | 2023.04.11 |
[백준/JAVA] 2164번: 카드2 (0) | 2023.04.10 |
[백준/JAVA] 10773번: 제로 (0) | 2023.04.10 |
[백준/JAVA] 10828번: 스택 (0) | 2023.04.10 |