1. ๋ฌธ์ ์ค๋ช ๐
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: BLACK-RED TREE
, BST(Binary_Search_Tree)
- (0) BLACK-RED TREE ๋ก ๊ตฌํ๋ TreeSet์ ํ์ฉํ๋ค.
- ์ผ๋ฐ BST์ผ ๋์ Depth๋ฅผ ์ ์ฅํ๋
int [] depth
๋ฐฐ์ด๋ ๋ง๋ ๋ค.
- (1) TreeSet์ 0๊ณผ N-1์ ๋ฃ๋๋ค. (Null Pointer Exception ๋ฐฉ์ง)
depth[0]๊ณผ depth[N-1] ์ ๊ฐ์ -1์ ๋ฃ๋๋ค. (๊ณ์ฐ์ ์ํฅ์ ์ฃผ์ง ์๊ธฐ ์ํจ) - (2) TreeSet์ root ๋
ธ๋๋ถํฐ ๋๋
ธ๋๊น์ง ์ฐจ๋ก๋ก ์กฐํํ๋ค.
์กฐํํ์ ๋น์์ ํด๋น ๋ ธ๋๋ณด๋ค ์์ผ๋ฉด์ ์ต๋๊ฐ๊ณผ ํฌ๋ฉด์ ์ต์๊ฐ์ธ ๋ ธ๋๊ฐ ๋ฌด์์ธ์ง ๊ตฌํ๋ค. - (3) depth[ํ์ฌ ๋ ธ๋] = (2)์์ ๊ตฌํ ๋ ์ค depth ๊ฐ์ด ๋ ํฐ ๊ฐ + 1 ์ด๋ค.
- (4) ๋ ธ๋๋ค์ ์ํํ๋ฉฐ ๊ทธ๋์ depth๋ฅผ ๊ตฌํ๊ณ ๊ทธ๊ฒ์ ๋์ ๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
(0) BST ๊ตฌํํ๋ฉด ์๋จ?
์๋๋ค. ์ต์ ์ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ 300,000๊ฐ๊ฐ ๋ด๋ฆผ์ฐจ์ ํน์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฅ๋ ๊ฒ์ด๋ค. ์ด ๊ฒฝ์ฐ BST์ ์๊ฐ๋ณต์ก๋๋ O(N)์ด ๋๋๋ฐ, ์ด๊ฒ์ด ๋จ๋ฐ์ ์ธ ๊ฒ์ด ์๋๋ผ, ์ฒซ๋ฒ์งธ ๊ฐ ์ฝ์ : O(1), ๋ ๋ฒ์งธ ๊ฐ ์ฝ์ O(2), ์ธ ๋ฒ์งธ ๊ฐ ์ฝ์ O(3)๋ก ์ ์ฐจ ์ฐ์ฐํ์๊ฐ ์ฆ๊ฐํ๋ค. ์ฆ $O(\frac{N*(N+1)}{2})$ ์ฆ $O(N^{2})$๊ฐ ๋๋ฏ๋ก ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ค.
(1) BST ๋ง๊ณ BLACK-RED TREE ์จ๋ ๋จ?
๋ฌธ์ ์์ ๋ฐ๋ผ๋ ๊ฑด BST์์์ ๋น๊ต ํ์ ๋์ ์ถ๋ ฅ ์ธ๋ฐ, BLACK-RED TREE๋ฅผ ์จ๋ ๋๋๊ฐ?
์ด๋ฌํ ์๋ฌธ์ด ๋ค ์ ์๋ค. ๊ฒฐ๋ก ์ ์ค์ TREE ๋ชจ์์ ํ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, ๋น๊ตํ์๋ง ๋ด์ผ๋ก ์๊ด์๋ค
์ด๋ค.
a. BLACK-RED TREE ๋? โจ
BLACK-RED TREE๋ ์๊ฐ ๊ท ํ Tree ๋ก์ BST์์ ๋นํจ์จ์ ์ผ๋ก ๊น์ด๊ฐ ๊น์ด์ง๋ ๊ฒ์ ๋ด๋ถ ๊ท์น
์ ํตํด ๋ฐฉ์งํ์ฌ, ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ฉด์๋ ํจ์จ์ ์ธ ์ฝ์
, ์ญ์ , ์กฐํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ Tree ์ด๋ค.
์ผ์ชฝ์ด ์ผ๋ฐ BST์ด๊ณ , ์ค๋ฅธ์ชฝ์ด BLACK-RED TREE ์ด๋ค. BST์์๋ ์์ ๊ฐ์ด ์ค๋ฆ์ฐจ์ ๋ด๋ฆผ์ฐจ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ฉด O(N)์ ์ฝ์ ์๊ฐ์ด ๋ค์ง๋ง, BLACK-RED TREE๋ ์ ๋ฌํ ๊ฒฝ์ฐ์๋ O(logN)์ด ๋ ๋ค.
๋์ ๋ชจ์์๊ฐ ์ด๋ ๊ฒ ๋ค๋ฅธ๋ฐ, ์ด๋ป๊ฒ ํ์ฉํด์ผ ํ ๊น?
b. C๋ ํ๋ฒ์ ์กฐํ์์ ์ผ๋ง๋ ์ฆ๊ฐํ๋๊ฐ?
C๋ ํ์ฌ ์กฐํ ์ค์ธ ๋ ธ๋์ ๊น์ด ๋งํผ ์ฆ๊ฐํ๋ค. ํ์ฌ ์กฐํ์ค์ธ Node์ ๊น์ด๋ ํด๋น NODE๊ฐ ๋ค์ด๊ฐ๊ธฐ ์ , ๊ทธ NODE์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋์ ๊น์ด + 1์ด๋ค.
์์ ์ผ์ชฝ ์์์์๋ 2
๋ฅผ ๋ฃ์ ๋๋ depth 0์ 1๋ณด๋ค ํ์นธ ๊น์ด์ ธ์ c += 0 + 1 ํ๋ฉด ๋์๊ณ , 3
์ ๋ฃ์ ๋๋ depth 1์ธ 2๋ณด๋ค ํ์นธ ๊น์ด์ก์ผ๋, c += 0 + 1 + 1, 4
๋ฅผ ๋ฃ์ ๋๋ depth 2์ธ 3๋ณด๋ค 1 ๋์์ ธ c+= 0 + 1 + 1 + 1์ ํด์ฃผ๋ฉด ๋๋ค.
๊น์ด๋ ๋ฌ๋ฆฌ๋ณด๋ฉด, ํด๋น ๋
ธ๋๊ฐ ๊น์ด์ง ๋๊น์ง์ ๋น๊ตํ์์ ๊ฐ์ ๋ง์ด๋ค. ์ผ์ชฝ ์์๋ฅผ ๋ณด๋ฉด 4๋ 3๋ฒ์ ๋น๊ต๋ฅผ ๊ฑฐ์ณ ์๋ฆฌ๋ฅผ ์ก์๊ณ , 3์ 2๋ฒ์ ๋น๊ต๋ฅผ ๊ฑฐ์ณ, 2๋ ํ ๋ฒ์ ๋น๊ต๋ฅผ ๊ฑฐ์ณ ์๋ฆฌ๋ฅผ ์ก์๋ค. ์ด๊ฒ ๋ํ ๋์ ์ผ๋ก ๋ํ๋ด๋ฉด
4๋ ๋
ธ๋ 3
์ ๋น๊ต ํ์ + 1๋งํผ ๋น๊ตํด์ ์๋ฆฌ๋ฅผ ์ก์๊ณ , 3์ ๋
ธ๋ 2
์ ๋น๊ตํ์ + 1๋งํผ ๋น๊ตํด์ ์๋ฆฌ๋ฅผ ์ก์๊ณ , 2๋ ๋
ธ๋ 1
์ ๋น๊ตํ์ + 1๋งํผ ๋น๊ตํด์ ์๋ฆฌ๋ฅผ ์ก์๋ค.
๋ฐ๋ผ์ ๋ด๊ฐ ํ๊ณ ์ถ์ ๋ง์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋
ธ๋์ ๋น๊ตํ์ + 1์ C์ ๋ํด๊ฐ๋ฉด ๋๋ค๋ ๊ฒ์ด๋ค. ์ด๋ B-R Tree
์์๋ ๋
ธ๋ ๊ฐ๊ฐ์ ๋์ ๋ ๋น๊ตํ์๋ BST์ ๊ฐ๋ค. ๋ฐ๋ผ์ B-R
Tree๋ฅผ ์ฐ๋ฉฐ, ์กฐํํ๋ ๊ฐ๋ง๋ค ๊ฐ์ฅ ๊ฐ๊น์ด ๋
ธ๋์ ๋น๊ตํ์ + 1์ฉ ํด๋๊ฐ๋ฉด ๋๋ค.
c. ๊ฐ๊น์ด ๋ ธ๋๊ฐ 2๊ฐ์ผ ์ ์๋๋ฐ, ์ด๊ฑด ์ด๋ป๊ฒ ํจ?
๋ง์ฝ ํ ๋ ธ๋๊ฐ 5์ด๊ณ 4์ 6์ด๋ ๋ ธ๋๊ฐ ๋์์ ์กด์ฌํ ์ ์๋ค. ์ด๋๋ ๋น๊ต ํ์๊ฐ ๋ ๋์ ๊ฐ์ ๋น๊ต ํ์๋ฅผ ์ด๋ค. ์๋ํ๋ฉด ๋น๊ต๋ฅผ ๋ ๋ง์ด ํ ๊ฒ์ด ๊น์ด๊ฐ ๋ ๊น๋ค๋ ์๋ฆฌ์ด๊ณ , ํ์ฌ ์ฝ์ ๋ ๊ฐ์ ๋ฆฌํ๋ ธ๋์ ๊ฐ๊น๊ฒ ๋ฐฐ์น๋๊ธฐ ๋๋ฌธ์ด๋ค.
(2) 0๊ณผ N-1์ ๋ฃ๋ ์ด์
๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋ 2๊ฐ๋ฅผ ์ถ๋ ฅํด์ผ ํ๋๋ฐ, ์ฝ์ ํ๋ ๊ฐ์ด ๋น์์ ์ต์๊ฐ ํน์ ์ต๋๊ฐ์ด๋ฉด, NullException์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋์ depth๋ฅผ -1๋ก ์ค์ ํ๋ฉด, ์ฐ๋ฆฌ๋ ๋น๊ต ํ์๊ฐ ๋ ๋์ ๊ฐ๋ง ์ฌ์ฉํ๊ธฐ์, ๊ณ์ฐ์์ ๊ฑธ๋ฆผ๋์ด ๋์ง ์๋๋ค.
(3) ์ง์ ํด๋ณด๊ธฐ
์ฌ์ค ๋๋, BLACK-RED TREE๊ฐ ์ต์์น ์๊ณ , ๊ณต์ ๋ ๋ต๋ณ์ด ๋ด ์๋ฌธ์ ์ ์์ํ๊ฒ ํด์ํด์ฃผ์ง ์์์ ์ง์ ํด๋ณด๋ฉด์ ์ง๊ด์ ์ผ๋ก ์ตํ๋ค. ์์ง๋ BLACK-RED TREE์ BST ๋ชจ๋ ๋
ธ๋๋ง๋ค ๋์ ๋ ๋น๊ตํ์๊ฐ ๊ฐ์ ์ด์ ๋ ํด์คํ์ง ๋ชปํ๊ฒ ๋ค. ํ์ง๋ง ์์๋ฅผ ์ง์ ํด๋ณด๋ฉด์ ๋๋ต์ ์ผ๋ก๋๋ง ์ดํด๋ฅผ ํ๊ธด ํ๋ค.
๋ค์์ ์
๋ ฅ์ด 2, 11, 4, 12, 6, 13, 8,14, 10, 15, 1, 16, 3, 17, 5, 18, 7, 19, 9
๋ก ๋ค์ด๊ฐ์ ๋ BST์ BLACK-RED TREE์ ๋ชจ์์ด๋ค.
์ํ๋์์ค์ฝ ๋ํ์์ ๊ทธ๋ํ ๋น์ฃผ์ผ๋ผ์ด์ ธ๋ฅผ ๋ง๋ค์ด์ ๋ฌด๋ฃ๋ก ์ฌ๋ ค๋์๋ค ใ ใ ์ด๊ฑธ ์ฐ๋ฉด ์์ ๋ค๋ฉฐ ์ดํดํ๊ธฐ ์ฌ์ฐ๋ ์ง์ ํด๋ณด๋ฉฐ ์ตํ๊ธธ ๋ฐ๋๋ค. ๋ค์์ ๋งํฌ๋ค.
https://www.cs.usfca.edu/~galles/visualization/BST.html
https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
3. ์ฝ๋ ์๊ฐ ๐
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TreeSet;
public class Main {
static int N;
static long sum = 0;
static int [] depth = new int [300002];
static TreeSet<Integer> BST = new TreeSet<>();
public static void main(String[] args) throws IOException {
StringBuilder answer = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
BST.add(0); BST.add(N+1);
depth[0] = -1; depth[N+1] = -1;
for (int i = 0; i < N; i++) {
int now = Integer.parseInt(br.readLine());
depth[now] = Math.max(depth[BST.lower(now)], depth[BST.higher(now)]) + 1;
BST.add(now);
sum += depth[now];
answer.append(sum).append("\n");
}
System.out.println(answer.toString());
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
BLACK-RED TREE
์ ๋๋ต์ ์ผ๋ก๋๋ง ์ดํดํ ๊ฒ ๊ฐ๋ค.