๐ ๋ฐฑ์ค 1966 ํ๋ฆฐํฐ ํ https://www.acmicpc.net/problem/1966
๋ฌธ์
์ฌ๋ฌ๋ถ๋ ์๋ค์ํผ ์ฌ๋ฌ๋ถ์ ํ๋ฆฐํฐ ๊ธฐ๊ธฐ๋ ์ฌ๋ฌ๋ถ์ด ์ธ์ํ๊ณ ์ ํ๋ ๋ฌธ์๋ฅผ ์ธ์ ๋ช ๋ น์ ๋ฐ์ โ์์๋๋กโ, ์ฆ ๋จผ์ ์์ฒญ๋ ๊ฒ์ ๋จผ์ ์ธ์ํ๋ค. ์ฌ๋ฌ ๊ฐ์ ๋ฌธ์๊ฐ ์์ธ๋ค๋ฉด Queue ์๋ฃ๊ตฌ์กฐ์ ์์ฌ์ FIFO - First In First Out - ์ ๋ฐ๋ผ ์ธ์๊ฐ ๋๊ฒ ๋๋ค. ํ์ง๋ง ์๊ทผ์ด๋ ์๋ก์ด ํ๋ฆฐํฐ๊ธฐ ๋ด๋ถ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ์๋๋ฐ, ์ด ํ๋ฆฐํฐ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ธ์๋ฅผ ํ๊ฒ ๋๋ค.
- ํ์ฌ Queue์ ๊ฐ์ฅ ์์ ์๋ ๋ฌธ์์ โ์ค์๋โ๋ฅผ ํ์ธํ๋ค.
- ๋๋จธ์ง ๋ฌธ์๋ค ์ค ํ์ฌ ๋ฌธ์๋ณด๋ค ์ค์๋๊ฐ ๋์ ๋ฌธ์๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด, ์ด ๋ฌธ์๋ฅผ ์ธ์ํ์ง ์๊ณ Queue์ ๊ฐ์ฅ ๋ค์ ์ฌ๋ฐฐ์น ํ๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ฐ๋ก ์ธ์๋ฅผ ํ๋ค.
์๋ฅผ ๋ค์ด Queue์ 4๊ฐ์ ๋ฌธ์(A B C D)๊ฐ ์๊ณ , ์ค์๋๊ฐ 2 1 4 3 ๋ผ๋ฉด C๋ฅผ ์ธ์ํ๊ณ , ๋ค์์ผ๋ก D๋ฅผ ์ธ์ํ๊ณ A, B๋ฅผ ์ธ์ํ๊ฒ ๋๋ค.
์ฌ๋ฌ๋ถ์ด ํ ์ผ์, ํ์ฌ Queue์ ์๋ ๋ฌธ์์ ์์ ์ค์๋๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๋ค ํ ๋ฌธ์๊ฐ ๋ช ๋ฒ์งธ๋ก ์ธ์๋๋์ง ์์๋ด๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ์์ ์์์ C๋ฌธ์๋ 1๋ฒ์งธ๋ก, A๋ฌธ์๋ 3๋ฒ์งธ๋ก ์ธ์๋๊ฒ ๋๋ค.
์ ๋ ฅ
์ฒซ ์ค์ ํ ์คํธ์ผ์ด์ค์ ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ์ผ์ด์ค๋ ๋ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
ํ ์คํธ์ผ์ด์ค์ ์ฒซ ๋ฒ์งธ ์ค์๋ ๋ฌธ์์ ๊ฐ์ N(1 โค N โค 100)๊ณผ, ๋ช ๋ฒ์งธ๋ก ์ธ์๋์๋์ง ๊ถ๊ธํ ๋ฌธ์๊ฐ ํ์ฌ Queue์์ ๋ช ๋ฒ์งธ์ ๋์ฌ ์๋์ง๋ฅผ ๋ํ๋ด๋ ์ ์ M(0 โค M < N)์ด ์ฃผ์ด์ง๋ค. ์ด๋ ๋งจ ์ผ์ชฝ์ 0๋ฒ์งธ๋ผ๊ณ ํ์. ๋ ๋ฒ์งธ ์ค์๋ N๊ฐ ๋ฌธ์์ ์ค์๋๊ฐ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค. ์ค์๋๋ 1 ์ด์ 9 ์ดํ์ ์ ์์ด๊ณ , ์ค์๋๊ฐ ๊ฐ์ ๋ฌธ์๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ์๋ ์๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ๋ฌธ์๊ฐ ๋ช ๋ฒ์งธ๋ก ์ธ์๋๋์ง ์ถ๋ ฅํ๋ค.
ํ์ด
์ด ๋ฌธ์ ๋ Queue๋ฅผ ๊ตฌํํด์ผํ๋ ๋ฌธ์ ์ด๋ค.
์ ๋ ฅ ๋ค์ด์จ N๊ฐ์ ๋ฌธ์๊ฐ ํ ์์ ๋์ด๋์ด์๊ณ , ๊ทธ ์ค ์ค์๋๊ฐ ๋์ ๋ฌธ์๋ถํฐ ์ฐจ๋ก๋๋ก poll() ํด์ผํ๋ค.
์ฆ, ๊ฐ ๋ฌธ์์ ๋ฌธ์์ ์ค์๋๋ฅผ ๊ฐ๊ณ ์์ด์ผํ๋ค๋ ๊ฒ์ด๋ค.
๋๋ ์ด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด static member class๋ฅผ ์์ฑํ์ฌ์คฌ๋ค.
Inner class ์ static member class
Inner class๋ฅผ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ฐ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ๋๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๋ค.
static member class๋ก๋ ๋๋ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด static์ด ๋ถ์๋ค๊ณ ํด์ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๊ฐ๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋์ง ์๋๋ค.
์ฆ, ํด๋์ค์ static ํค์๋๊ฐ ๋ถ๊ฒ ๋๋ค๋ฉด ์ธ์คํด์ค ์์ฑ ๋ฐฉ์์ด ๋ณํํ ๋ฟ, ํด๋์ค๊ฐ ์ธ์คํด์ค์ ์ญํ ์ ํ๋๊ฒ์ ์๋๋ค๋ผ๋ ์๋ฏธ์ด๋ค.
Inner Class
new ์ฐ์ฐ์๋ฅผ ๋๋ฒ ์ฌ์ฉํ์ฌ ๋๊ฐ์ ์ธ์คํด์ค ์์ฑ ์ ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ๋๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑ
์ธ๋ถ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์กด์ฌํด์ผ๋ง ๋ง๋ค ์ ์๋ค.
- Inner class๋ ์ธ๋ถ ํด๋์ค์ ๋ํ ์จ์ ์ธ๋ถ ์ฐธ์กฐ๋ฅผ ๊ฐ๊ฒ๋๋ค.
static member class
- new ์ฐ์ฐ์๋ฅผ ํ๋ฒ ์ฌ์ฉํ์ฌ ๋๊ฐ์ ์ธ์คํด์ค ์์ฑ ์ ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ๋๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑ
- ํด๋์ค์ static ํค์๋๊ฐ ๋ถ๊ฒ๋๋ค๋ฉด ์ธ์คํด์ค ์์ฑ ๋ฐฉ์์ด ๋ณํํ ๋ฟ, ํด๋์ค๊ฐ ์ธ์คํด์ค์ ์ญํ ์ ํ๋๊ฒ์ ์๋๋ค.
- ์ธ๋ถ ์ธ์คํด์ค๊ฐ ์์ด๋ ๋ง๋ค ์ ์๋ค.
- ์ธ๋ถ ์ฐธ์กฐ๊ฐ ์กด์ฌํ์ง ์๋๋ค.
์ธ๋ถ ์ฐธ์กฐ์ ๋จ์
์ฐธ์กฐ๊ฐ์ ๋ด์์ผํ๊ธฐ ๋๋ฌธ์, ์ธ์คํด์ค ์์ฑ ์ ์๊ฐ ๊ณต๊ฐ์ ์ฑ๋ฅ ์ ํ - ์ธ๋ถ ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ๋ก ์ธํด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ธ์คํด์ค๋ฅผ ์๊ฑฐํ์ง ๋ชปํด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ๋ฐ์
์ฆ, ๋ด๋ถ ํด๋์ค ์ ์ธ ์์๋ static member class๋ก ์์ฑํ๋ ํธ์ด ์ด์ ์ด ๋ ๋ง๋ค.
์ฐธ๊ณ ๋ธ๋ก๊ทธ https://siyoon210.tistory.com/141
๊ทธ๋ฆฌ๊ณ ๋ฌธ์์ ์ค์๋๋ง ๊ฐ๋ PriorityQueue๋ ๋ฐ๋ก ์ ์ธํ์ฌ์คฌ๋ค.
PriorityQueue (์ฐ์ ์์ ํ)
PriorityQueue
์ผ๋ฐ์ ์ธ ํ์ ๊ตฌ์กฐ์ธ FIFO๋ฅผ ๊ฐ์ง๋ง, ๋ฐ์ดํฐ๊ฐ ๋ค์ด์จ ์์๋๋ก ๋๊ฐ๋ ๊ฒ์ด ์๋๋ผ ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ๊ณ , ๊ทธ ์ฐ์ ์์๊ฐ ๋์ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ๋ ๊ตฌ์กฐ์ด๋ค.
PriorityQueue ํน์ง
์ฐ์ ์์๊ฐ ๋์ ์์๋ฅผ ๋จผ์ ๊บผ๋ด์ด ์ฒ๋ฆฌํ๋ค.
๋ด๋ถ ์์๋ Heap์ผ๋ก ๊ตฌ์ฑ๋์ด ์ด์งํธ๋ฆฌ์ ๊ตฌ์กฐ์ด๋ค.
๋ด๋ถ ์์๊ฐ Heap์ผ๋ก ๊ตฌ์ฑ๋์ด ์๊ฐ ๋ณต์ก๋๊ฐ O(nLogn)์ด๋ค.
์ฐธ๊ณ ๋ธ๋ก๊ทธ https://velog.io/@gillog/Java-Priority-Queue%EC%9A%B0%EC%84%A0-%EC%88%9C%EC%9C%84-%ED%81%90
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.io.*;
import java.util.*;
public class Main {
static class Papers{
int paper, priority;
public Papers(int paper, int priority) {
this.paper = paper;
this.priority = priority;
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
Queue<Papers> q = new LinkedList<>();
// ์ฐ์ ์์๊ฐ ๋์ ์์ผ๋ก ์ ๋ ฌํด์ผํ๋ฏ๋ก reverseOrder๋ฅผ ํตํด ์ญ์ ๋ ฌ์ ํด์ค๋ค.
PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());
int t = Integer.parseInt(br.readLine());
for(int i = 0; i < t; i++) {
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for(int j = 0; j < n; j++) {
int priority = Integer.parseInt(st.nextToken());
q.add(new Papers(j,priority));
pq.add(priority);
}
int count = 1; // ๋ช๋ฒ์งธ์ธ์ง ์นด์ดํธ
while(true) {
// ํ์ ์ฒซ ์์์ ์ค์๋์ ์ฐ์ ์์ํ์ ์ ์ผ ๋์ ์ค์๋๊ฐ ์ผ์นํ๋ฉด
if(Objects.requireNonNull(q.peek()).priority == Objects.requireNonNull(pq.peek())) {
// ๋ชฉํํ ์์๋ผ๋ฉด ๋ฐ๋ณต๋ฌธ์ ๋ฉ์ถ๋ค
if(q.peek().paper == m) break;
// ์๋๋ผ๋ฉด ์นด์ดํธ๋ฅผ ์ฌ๋ ค์ฃผ๊ณ
count++;
// ํ์ ์ฐ์ ์์ ํ์์ ํด๋น ๋ฌธ์, ํด๋น ์ค์๋๋ฅผ ๋นผ์ค๋ค
q.poll();
pq.poll();
// ํ์ ์ฒซ ์์ ์ค์๋์ ์ฐ์ ์์ ํ์ ์ ์ผ ๋์ ์ค์๋๊ฐ ์ผ์นํ์ง์๋ค๋ฉด ํด๋น ๋ฌธ์๋ฅผ ํ์ ๋งจ ๋ค๋ก ๋ณด๋ด์ค๋ค
} else q.add(q.poll());
}
q.clear();
pq.clear();
sb.append(count).append("\n");
}
System.out.println(sb);
}
}