๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/7662
โธ ๋ฌธ์
์ด์ค ์ฐ์ ์์ ํ(dual priority queue)๋ ์ ํ์ ์ธ ์ฐ์ ์์ ํ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ , ์ญ์ ํ ์ ์๋ ์๋ฃ ๊ตฌ์กฐ์ด๋ค. ์ ํ์ ์ธ ํ์์ ์ฐจ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๋ ์ฐ์ฐ(operation) ๋ช ๋ น์ ๋ฐ๋ผ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ฐ์ดํฐ ๋๋ ๊ฐ์ฅ ๋ฎ์ ๋ฐ์ดํฐ ์ค ํ๋๋ฅผ ์ญ์ ํ๋ ์ ์ด๋ค. ์ด์ค ์ฐ์ ์์ ํ๋ฅผ ์ํด์ ๋ ๊ฐ์ง ์ฐ์ฐ์ด ์ฌ์ฉ๋๋๋ฐ, ํ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ์ฐ์ฐ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ์ฐ์ฐ์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ์ฐ์ฐ์ ๋ ๋ ๊ฐ์ง๋ก ๊ตฌ๋ถ๋๋๋ฐ ํ๋๋ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๊ฒ์ ์ญ์ ํ๊ธฐ ์ํ ๊ฒ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋ฎ์ ๊ฒ์ ์ญ์ ํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
์ ์๋ง ์ ์ฅํ๋ ์ด์ค ์ฐ์ ์์ ํ Q๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์. Q์ ์ ์ฅ๋ ๊ฐ ์ ์์ ๊ฐ ์์ฒด๋ฅผ ์ฐ์ ์์๋ผ๊ณ ๊ฐ์ฃผํ์.
Q์ ์ ์ฉ๋ ์ผ๋ จ์ ์ฐ์ฐ์ด ์ฃผ์ด์ง ๋ ์ด๋ฅผ ์ฒ๋ฆฌํ ํ ์ต์ข ์ ์ผ๋ก Q์ ์ ์ฅ๋ ๋ฐ์ดํฐ ์ค ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
โธ ์ ๋ ฅ
์ ๋ ฅ ๋ฐ์ดํฐ๋ ํ์ค์ ๋ ฅ์ ์ฌ์ฉํ๋ค. ์ ๋ ฅ์ T๊ฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋๋ค. ์ ๋ ฅ์ ์ฒซ ๋ฒ์งธ ์ค์๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ์๋ฅผ ๋ํ๋ด๋ ์ ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ๋ฐ์ดํฐ์ ์ฒซ์งธ ์ค์๋ Q์ ์ ์ฉํ ์ฐ์ฐ์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ k (k ≤ 1,000,000)๊ฐ ์ฃผ์ด์ง๋ค. ์ด์ด์ง๋ k ์ค ๊ฐ๊ฐ์ ์ฐ์ฐ์ ๋ํ๋ด๋ ๋ฌธ์(‘D’ ๋๋ ‘I’)์ ์ ์ n์ด ์ฃผ์ด์ง๋ค. ‘I n’์ ์ ์ n์ Q์ ์ฝ์ ํ๋ ์ฐ์ฐ์ ์๋ฏธํ๋ค. ๋์ผํ ์ ์๊ฐ ์ฝ์ ๋ ์ ์์์ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋ค. ‘D 1’๋ Q์์ ์ต๋๊ฐ์ ์ญ์ ํ๋ ์ฐ์ฐ์ ์๋ฏธํ๋ฉฐ, ‘D -1’๋ Q ์์ ์ต์๊ฐ์ ์ญ์ ํ๋ ์ฐ์ฐ์ ์๋ฏธํ๋ค. ์ต๋๊ฐ(์ต์๊ฐ)์ ์ญ์ ํ๋ ์ฐ์ฐ์์ ์ต๋๊ฐ(์ต์๊ฐ)์ด ๋ ์ด์์ธ ๊ฒฝ์ฐ, ํ๋๋ง ์ญ์ ๋จ์ ์ ๋ ํ๊ธฐ ๋ฐ๋๋ค.
๋ง์ฝ Q๊ฐ ๋น์ด์๋๋ฐ ์ ์ฉํ ์ฐ์ฐ์ด ‘D’๋ผ๋ฉด ์ด ์ฐ์ฐ์ ๋ฌด์ํด๋ ์ข๋ค. Q์ ์ ์ฅ๋ ๋ชจ๋ ์ ์๋ -231 ์ด์ 231 ๋ฏธ๋ง์ธ ์ ์์ด๋ค.
โธ ์ถ๋ ฅ
์ถ๋ ฅ์ ํ์ค์ถ๋ ฅ์ ์ฌ์ฉํ๋ค. ๊ฐ ํ ์คํธ ๋ฐ์ดํฐ์ ๋ํด, ๋ชจ๋ ์ฐ์ฐ์ ์ฒ๋ฆฌํ ํ Q์ ๋จ์ ์๋ ๊ฐ ์ค ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ผ. ๋ ๊ฐ์ ํ ์ค์ ์ถ๋ ฅํ๋ ํ๋์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๋ผ. ๋ง์ฝ Q๊ฐ ๋น์ด์๋ค๋ฉด ‘EMPTY’๋ฅผ ์ถ๋ ฅํ๋ผ.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 4
- ๐ ๋ฌธ์ ์ ํ : ์๋ฃ ๊ตฌ์กฐ, ์งํฉ๊ณผ ๋งต, ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์งํฉ๊ณผ ๋งต, ์ฐ์ ์์ ํ
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐ์ ์์ ํ(Priority Queue) ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋, ์๋ก์ด ๊ฐ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์ ๋ ฌ๋ ์ํ๋ฅผ ์ ์งํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๊ฒ ์ ๋ ฌ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ฉด ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค.
๋จ์ํ remove() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋ด๋ถ์์ ์ํ๋ ์์๋ฅผ ์ ๊ฑฐํ๋ ค ํ๋ฉด, ํ๋ฅผ ์์ฐจ ํ์ํด์ผ ํ๋ฏ๋ก O(n) ์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฐ์ํด ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ค. ๋ฐ๋ผ์ ๋ ํจ์จ์ ์ธ ๋ฐฉ์์ด ํ์ํ๋ค.
1๏ธโฃ ์ต์ํ, ์ต๋ํ๊ณผ Map ์ฌ์ฉ
ํ์ ์๋๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ต๋ ํ(Max Heap) ๊ณผ ์ต์ ํ(Min Heap), ๋ ๊ฐ์ ์ฐ์ ์์ ํ๋ฅผ ๋์์ ์ฌ์ฉํ๋ค.
- ์ต์ ํ(Min Heap) : ์์ ์ด์งํธ๋ฆฌ ๊ตฌ์กฐ์ด๋ฉฐ, ๋ฃจํธ ๋ ธ๋๋ก ์ฌ๋ผ๊ฐ์๋ก ๊ฐ์ด ์์์ง๋ค.
- ์ต๋ ํ(Max Heap) : ์์ ์ด์งํธ๋ฆฌ ๊ตฌ์กฐ์ด๋ฉฐ, ๋ฃจํธ ๋ ธ๋๋ก ์ฌ๋ผ๊ฐ์๋ก ๊ฐ์ด ์ปค์ง๋ค.
์ ๋ ฅ๋ฐ์ ์ ์๋ฅผ ๋ ํ์ ๋์์ ์ ์ฅํด๋๋ฉด, ์ต๋๊ฐ๊ณผ ์ต์๊ฐ ํ์์ O(1) ์ ์ฒ๋ฆฌํ ์ ์๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๊ฐ์ ์ ์๊ฐ ์ต๋ ํ๊ณผ ์ต์ ํ์์ ์๋ก ๋ค๋ฅธ ์์น์ ์ ์ฅ๋๋ฏ๋ก, ํ๋์ ํ์์ ์ญ์ ํ ๊ฐ์ด ๋ค๋ฅธ ํ์๋ ์ฌ์ ํ ๋จ์ ์์ ์ ์๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Map์ ํจ๊ป ์ฌ์ฉํ๋ค.
- Map์๋ ๊ฐ ์ ์์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ค.
- ์ด๋ค ํ์์ ์์๋ฅผ ๊บผ๋ผ ๋, Map์ ํ์ธํ์ฌ ์ด๋ฏธ ๋ค๋ฅธ ํ์์ ์์ง๋ ๊ฐ์ด๋ผ๋ฉด ๋ฒ๋ฆฌ๊ณ ๋ค์ ๊บผ๋ธ๋ค.
- Map์์ ๊ฐ์๊ฐ 0์ด ๋๋ฉด ํด๋น ํค๋ฅผ ์ ๊ฑฐํ๋ค.
์ด ๊ณผ์ ์ ํตํด ๋ ํ์ ๋ฐ์ดํฐ ์ํ๋ฅผ ๋๊ธฐํํ ์ ์๋ค.
๐ delete ๋ฉ์๋
delete() ๋ฉ์๋๋ ํ์์ ๊ฐ์ ๊บผ๋ด๊ณ , ๊ทธ ๊ฐ์ด ์ ํจํ์ง Map์ ํ์ธํ ๋ค ๊ฐ์๋ฅผ ์กฐ์ ํ๋ ์ญํ ์ ํ๋ค.
- ํ์์ ํ๋ ๊บผ๋ธ ํ, Map์์ ํด๋น ๊ฐ์ ๋จ์ ๊ฐ์๋ฅผ ํ์ธํ๋ค.
- ์ด๋ฏธ ๋ค๋ฅธ ํ์์ ๋ชจ๋ ์์ง๋ ๊ฐ์ด๋ผ๋ฉด ๋ฒ๋ฆฌ๊ณ (continue), ๋ค์ ๊บผ๋ธ๋ค.
- ์ ํจํ ๊ฐ์ด๋ผ๋ฉด Map์ ๊ฐ์๋ฅผ 1 ์ค์ด๊ฑฐ๋, 0์ด ๋๋ฉด ํค๋ฅผ ์ ๊ฑฐํ๋ค.
์ฆ, delete() ๋ฉ์๋๊ฐ ๋ ํ๊ณผ Map์ ์ํ๋ฅผ ์ผ์น์์ผ ์ฃผ๊ธฐ ๋๋ฌธ์ ์ต์ข ์ ์ผ๋ก ์ฌ๋ฐ๋ฅธ ์ต๋๊ฐ, ์ต์๊ฐ์ ์ป์ ์ ์๋ค.
์ด ๋ฌธ์ ๋ TreeMap์ ์ฌ์ฉํด์ ํด๊ฒฐํ ์๋ ์๋ค.
๐ก TreeMap ํน์ง
TreeMap์ ๋ด๋ถ์ ์ผ๋ก ์ด์ง ํ์ ํธ๋ฆฌ(Red-Black Tree) ๊ตฌ์กฐ๋ก ๊ตฌํ๋์ด ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ๋ ์๋์ผ๋ก ์ ๋ ฌ๋ ์ํ๋ฅผ ์ ์งํ๋ค.
- ํ์, ์ฝ์ , ์ญ์ ๋ชจ๋ O(log N) ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ๋ฐ๋ผ์, PriorityQueue์์ ๋ฐ์ํ๋ ํ์ ๋ฐ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ TreeMap ํ๋๋ก ํด๊ฒฐํ ์ ์๋ค.
2๏ธโฃ TreeMap ์ฌ์ฉ
๊ธฐ์กด ๋ฐฉ์์์๋ ์ต์ํ + ์ต๋ํ ๋ ๊ฐ์ ์ฐ์ ์์ ํ, ์ค๋ณต ๊ฐ์ ๊ด๋ฆฌ๋ฅผ ์ํ Map, ์ด ์ธ ๊ฐ์ง๋ฅผ ๋์์ ์ฌ์ฉํด์ผ ํ๋ค.
ํ์ง๋ง TreeMap์ ์ ๋ ฌ๋ ์ํ ์ ์ง + Key-Value ๊ด๋ฆฌ๋ฅผ ๋์์ ์ ๊ณตํ๋ฏ๋ก, ์ด๋ฅผ ํ๋๋ก ํตํฉํ ์ ์๋ค.
- Key : ์ ์ ๊ฐ
- Value : ํด๋น ์ ์์ ๊ฐ์ (์ค๋ณต ๊ฐ์ ๊ด๋ฆฌ)
์ด ๋ฌธ์ ์์ ์ฌ์ฉํ ์ ์๋ TreeMap์ ์ฃผ์ ๋ฉ์๋๋ฅผ ์์๋ณด์.
- firstKey() : ๊ฐ์ฅ ์์ Key(์ต์๊ฐ) ๋ฐํ
- lastKey() : ๊ฐ์ฅ ํฐ Key(์ต๋๊ฐ) ๋ฐํ
- map.put(key, value) : ์ ์๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ๊ฐ์๋ฅผ ๊ฐฑ์
- map.remove(key) : ํด๋น Key์ ๊ฐ์๊ฐ 0์ด ๋๋ฉด ์ ๊ฑฐ
์ญ์ ์ฐ์ฐ ์์๋
- ์ต๋๊ฐ(lastKey()) ๋๋ ์ต์๊ฐ(firstKey())์ ์ฐพ๋๋ค.
- ํด๋น Key์ ๊ฐ์๋ฅผ 1 ์ค์ธ๋ค.
- ๊ฐ์๊ฐ 0์ด ๋๋ฉด remove()๋ก ์์ ํ ์ ๊ฑฐํ๋ค.
๋ฐ๋ผ์, TreeMap์ ์ฌ์ฉํ๋ฉด ์ฝ์ /์ญ์ /ํ์์ ๋ชจ๋ O(log N)์ ์ฒ๋ฆฌํ ์ ์๊ณ , ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ฉฐ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๋ฐ๋ก ์ป์ ์ ์์ด ๊ตฌํ์ด ํจ์ฌ ๋จ์ํด์ง๋ค.
์ ํ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํ ์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ๊ฐ๊ฐ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ฝ๋
1๏ธโฃ ์ต์ํ, ์ต๋ํ๊ณผ Map ์ฌ์ฉ
๋ฉ๋ชจ๋ฆฌ : 444180KB
์๊ฐ : 2872ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static Map<Integer, Integer> map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
StringTokenizer st;
while (t --> 0) {
int n = Integer.parseInt(br.readLine());
PriorityQueue<Integer> min = new PriorityQueue<>();
PriorityQueue<Integer> max = new PriorityQueue<>(Collections.reverseOrder());
map = new HashMap<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
char cmd = st.nextToken().charAt(0);
int value = Integer.parseInt(st.nextToken());
if (cmd == 'I') {
max.offer(value);
min.offer(value);
map.put(value, map.getOrDefault(value, 0)+1);
} else { // D
if (map.size() == 0) continue;
else {
// 1 : ์ต๋๊ฐ์ ์ญ์ , -1 : ์ต์๊ฐ์ ์ญ์
if (value == 1) delete(max);
else delete(min);
}
}
}
if (map.isEmpty()) sb.append("EMPTY").append('\n');
else {
int ans = delete(max);
sb.append(ans).append(" ");
if (map.size() > 0) ans = delete(min);
sb.append(ans).append("\n");
}
}
System.out.println(sb.toString());
br.close();
}
private static int delete(PriorityQueue<Integer> pq) {
int num;
while (true) {
num = pq.poll();
int cnt = map.getOrDefault(num, 0);
if (cnt == 0) continue; // ์ด๋ฏธ ๋ค๋ฅธ ํ์์ ์์ง๋ ๊ฐ์ด๋ฉด ๋ฒ๋ฆฌ๊ณ ๋ค์ ๋ฝ๊ธฐ
if (cnt == 1) map.remove(num); // ๋จ์ ๊ฒ 1๊ฐ๋ผ๋ฉด ์์ ์ ๊ฑฐ
else map.put(num, cnt-1); // 2๊ฐ ์ด์์ด๋ฉด ๊ฐ์๋ง ์ค์
break;
}
return num;
}
}
2๏ธโฃ TreeMap ์ฌ์ฉ
๋ฉ๋ชจ๋ฆฌ : 439824KB
์๊ฐ : 2340ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
StringTokenizer st;
while (t --> 0) {
int n = Integer.parseInt(br.readLine());
TreeMap<Integer, Integer> map = new TreeMap<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
char cmd = st.nextToken().charAt(0);
int value = Integer.parseInt(st.nextToken());
if (cmd == 'I') {
map.put(value, map.getOrDefault(value, 0)+1);
} else { // D
if (map.size() == 0) continue;
else {
// 1 : ์ต๋๊ฐ์ ์ญ์ , -1 : ์ต์๊ฐ์ ์ญ์
int num = (value == 1) ? map.lastKey() : map.firstKey();
// num์ ๊ฐ์๋ฅผ 1 ์ค์ด๊ณ (map.put(num, map.get(num) - 1))
// ๊ฐฑ์ ์ ๊ฐ์ด 1์ด์๋์ง ํ์ธ (== 1)
if (map.put(num, map.get(num)-1) == 1) {
map.remove(num); // ๊ฐ์๊ฐ 0์ด๋ฉด ์์ ํค๋ฅผ ์ ๊ฑฐ
}
}
}
}
if (map.isEmpty()) sb.append("EMPTY").append('\n');
else sb.append(map.lastKey()).append(" ").append(map.firstKey()).append("\n");
}
System.out.println(sb.toString());
br.close();
}
}
์ฒ์ ์ฐ์ ์์ ํ + Map ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ ๋๋, ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋์์ ๊ด๋ฆฌํด์ผ ํด์ ๋ค์ ๋ณต์กํ๋ค. ์ดํ ๊ตฌ๊ธ๋ง์ ํตํด TreeMap์ผ๋ก๋ ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ณ , ๊ธฐ์กด ๋ฐฉ์์ ๊ธฐ๋ฅ์ TreeMap ํ๋๋ก ํตํฉํ ์ ์์๋ค.
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด์, ํธ๋ฆฌ ํํ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ง๋ TreeMap์ด ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ ์ธก๋ฉด์์๋ ๋ ํจ์จ์ ์์ ํ์ธํ ์ ์์๋ค. ๐ค๐ก
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Boj_10972] ๋ค์ ์์ด (0) | 2025.08.20 |
|---|---|
| [Boj_1208] ๋ถ๋ถ์์ด์ ํฉ 2 (3) | 2025.08.10 |
| [Boj_1450] ๋ ์๋ฌธ์ (3) | 2025.08.07 |
| [Boj_1561] ๋์ด ๊ณต์ (4) | 2025.08.05 |
| [Boj_1194] ์์ด์คํฌ๋ฆผ ๋๋ ์งํธ (3) | 2025.08.05 |