์ด์ง ํ์ ํธ๋ฆฌ๋ฅผ ๊ณต๋ถํ๊ธฐ ์์, ํ์ ํธ๋ฆฌ๋ ๋ฌด์์ธ๊ฐ?
์ด๋ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๋ํด ์ ๊ทผ, ํ์, ์ฝ์ , ์ญ์ , ๊ฐฑ์ ๋ฑ์ ์ฐ์ฐ์ ์ํํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค.
ํ์ ํธ๋ฆฌ์ ์ข ๋ฅ๋ ๊ต์ฅํ ๋ค์ํ์ง๋ง, ์ ์ผ ๊ธฐ๋ณธ์ด๊ณ ์ ํ๋์ด ํ์ต๋์ด์ผ ํ๋ ๋ถ๋ถ์ด ๋ฐ๋ก ์ด์ง ํ์ ํธ๋ฆฌ์ด๋ค.
(๊ทธ ์ธ์ AVLํธ๋ฆฌ, 2-3 ํธ๋ฆฌ, 2-3-4 ํธ๋ฆฌ, B-ํธ๋ฆฌ, RB-ํธ๋ฆฌ ๋ฑ์ ๋ค๋ฅธ ํฌ์คํ ์ ์ฐธ๊ณ ํ์)
์ด์ง ํ์ ํธ๋ฆฌ
์ด์ง ํ์ ํธ๋ฆฌ(Binary Search Tree)๋,
์ด์ง ํ์์ ๊ฐ๋ ์ ํธ๋ฆฌ ํํ์ ๊ตฌ์กฐ์ ์ ๋ชฉํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค.
๐ค ๊ทธ๋ ๋ค๋ฉด ์ด์ง ํ์์ด๋?
์ ๋ ฌ๋ ๋ฐ์ดํฐ์ ์ค๊ฐ์ ์์นํ ํญ๋ชฉ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ ๋ถ๋ถ์ผ๋ก ๋๋์ด ๊ฐ๋ฉฐ ํน์ ํญ๋ชฉ์ ์ฐพ๋ ํ์ ๋ฐฉ๋ฒ์ด๋ค.
๋ค์๋งํด ์ด์ง ํ์ ํธ๋ฆฌ๋, ํธ๋ฆฌ ํํ์ ๊ตฌ์กฐ์์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๊ณ ๋น๊ตํ๋ฉฐ ํน์ ํญ๋ชฉ์ ์ฐพ๋ ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ์๊ฐํด ๋ณผ ์ ์๋ค.
์ด์ง ํ์ ํธ๋ฆฌ์ ํน์ง
์ด์ง ํ์ ํธ๋ฆฌ์์ ๊ฐ ๋ ธ๋๋ฅผ n์ด๋ผ๊ณ ํ์ ๋,
๊ฐ ๋ ธ๋ n์ ํค๋ n์ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ์ ์๋ ํค๋ณด๋ค ํฌ๊ณ n์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ํค๋ณด๋ค ์๋ค.
์ฆ, ๋ ธ๋ ์์ ์ ์ผ์ชฝ ์์์ ํค๋ ์์ ์ ํค๋ณด๋ค ์๊ณ , ๋ ธ๋ ์์ ์ ์ค๋ฅธ์ชฝ ์์์ ํค๋ ์์ ์ ํค๋ณด๋ค ํฌ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ๊ตฌ์กฐ ๋๋ฌธ์ ์ค์ ์ํ(์ผ์ชฝ, ์์ , ์ค๋ฅธ์ชฝ ์์๋ก ๋ฐฉ๋ฌธ)๋ฅผ ์ํํ๋ฉด, ์ ๋ ฌ๋ ์ํ๋ก ์ถ๋ ฅ๋๋ค๋ ํน์ง์ด ์๋ค.
์ด์ง ํ์ ํธ๋ฆฌ์ ํ์ ์ฐ์ฐ
ํ์ ์ฐ์ฐ์ ์๋์ ๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ฅธ๋ค.
1. ํ์ํ๋ Key๊ฐ k๋ผ๋ฉด, ๋ฃจํธ์ id์ k๋ฅผ ๋น๊ตํ๋ค.
2. k๊ฐ id๋ณด๋ค ์์ผ๋ฉด, ๋ฃจํธ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์์ k๋ฅผ ์ฐพ๊ณ , k๊ฐ id๋ณด๋ค ํฌ๋ค๋ฉด ๋ฃจํธ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์์ k๋ฅผ ์ฐพ์ผ๋ฉฐ,
id๊ฐ k์ ๊ฐ์ผ๋ฉด, ํ์์ ์ฑ๊ณตํ ๊ฒ์ด๋ฏ๋ก ๋ ธ๋์ Value๋ฅผ ๋ฐํํ๋ค.
3. ๊ฐ ์๋ธํธ๋ฆฌ(์ผ์ชฝ, ์ค๋ฅธ์ชฝ)์์ k๋ฅผ ํ์ํ๋ ์ฐ์ฐ์ ๋ฃจํธ์์ ํ์ํ๋ ๊ณผ์ ๊ณผ ๋์ผํ๋ฏ๋ก ํ์์ ์ฑ๊ณตํ ๋๊น์ง 2. ์ ๊ณผ์ ์ ๋ฐ๋ณตํด ์ค๋ค.
๋ค์์ ํ์์ฐ์ฐ์ ๊ตฌํํ ์ฝ๋์ด๋ค.
// ๋ฃจํธ๋ก ๋ถํฐ ํ์ ์์
public Value get(Key k) { return get(root, k);}
public Value get(Node n, Key k) {
// n์ด ๋ง์ฝ ์๋ ๋
ธ๋๋ผ๋ฉด null ๋ฆฌํด
if (n == null) return null;
// ํค ๋น๊ต
int t = n.getKey().compareTo(k);
if (t > 0) return get(n.getLeft(), k);
else if (t < 0) return get(n.getRight(), k);
// ํค๊ฐ ๊ฐ๋ค๋ฉด ํ์์ ์ฑ๊ณตํ ๊ฒ์ด๋ฏ๋ก, Value๋ฆฌํด(Value ํ์
์บ์คํ
)
else return (Value) n.getValue();
}
์ด์ง ํ์ ํธ๋ฆฌ์ ์ฝ์ ์ฐ์ฐ
์ฝ์ ์ ํ์ ์ฐ์ฐ๊ณผ ์ ์ฌํ๋ค.
ํ์ ์ฐ์ฐ์ ๋ง์ง๋ง์ null์ ๋ฐํํ์ง๋ง, ์ฝ์ ์ฐ์ฐ์ ์ฌ๊ธฐ์ ์ฝ์ ํ๋ ค๋ ๊ฐ์ ๊ฐ์ง ์ ๋ ธ๋๋ฅผ ์์ฑํ๊ณ ์ ๋ ธ๋๋ฅผ ๋ถ๋ชจ์ ์ฐ๊ฒฐ์ํจ๋ค.
์ด๋, ์ด๋ฏธ id๊ฐ ํธ๋ฆฌ์ ์์ผ๋ฉด name๋ง ๊ฐฑ์ ํ๋ค.
๋ค์์ ์ฝ์ ์ฐ์ฐ ์ฝ๋ ๊ตฌํ์ด๋ค.
public void put(Key k, Value v) { root = put(root, k, v);}
public Node put(Node n, Key k, Value v) {
// ์ฝ์
์์น์ ๋๋ฌ
if (n == null) return new Node(k, v);
// ํค๋ฅผ ๋น๊ตํ๋ฉฐ ์์น๋ฅผ ์ฐพ์
int t = n.getKey().compareTo(k);
// ์์น๋ฅผ ์ฐพ์๊ฐ๋ฉฐ, setLeft, setRightํจ์๋ฅผ ํตํด ๋ถ๋ชจ ๋
ธ๋์ ์ฐ๊ฒฐ ์ํด
if (t > 0) n.setLeft(put(n.getLeft(), k, v));
else if (t < 0) n.setRight(put(n.getRight(), k, v));
// ๋ง์ฝ ๊ฐ์ ํค ๊ฐ์ ๊ฐ์ง ๋
ธ๋๊ฐ ์๋ค๋ฉด Value๋ง ๊ฐฑ์
else n.setValue(v);
return n;
}
์ต์๊ฐ ์ฐพ๊ธฐ ๋ฐ ์ต์๊ฐ ์ญ์ ์ฐ์ฐ
์ด์ง ํ์ ํธ๋ฆฌ์์ ์ต์๊ฐ์ ์ด๋ป๊ฒ ์ฐพ๊ณ ๋ ์ด๋ป๊ฒ ์ญ์ ํด์ผ ํ๋์ง ์์์ผ ํ๋ ์ด์ ๋,
์ด์ง ํ์ ํธ๋ฆฌ์ ์ญ์ ์ฐ์ฐ์ด ์ด ์ต์๊ฐ ์ญ์ ์ฐ์ฐ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ค ์ต์๊ฐ ์ฐพ๊ธฐ๋?
๋ฃจํธ๋ก๋ถํฐ ์ผ์ชฝ ์์์ ๋ฐ๋ผ ๋ด๋ ค๊ฐ๋ฉฐ, null์ ๋ง๋ฌ์ ๋ null์ ๋ถ๋ชจ๊ฐ ๊ฐ์ง id์ด๋ค.
public Key min() {
// root๊ฐ null์ด๋ฉด null์ ๋ฆฌํด
if (root = null) return null;
// Key๊ฐ์ผ๋ก ํ์
์บ์คํ
, root๋ก ๋ถํฐ ํ์ ์์
return (Key) min(root).getKey();
}
private Node min(Node n) {
// ์ผ์ชฝ ์์์ด null์ผ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํ์
if (n.getLeft() == null) return n;
return min(n.getLeft());
}
์ต์๊ฐ ์ญ์ ์ฐ์ฐ
์ต์๊ฐ์ ๊ฐ์ง ๋ ธ๋ x๋ฅผ ์ฐพ์๋ธ ๋ค, x์ ๋ถ๋ชจ p์ x์ ์ค๋ฅธ์ชฝ ์์ c๋ฅผ ์ฐ๊ฒฐํ๋ค.
public void deleteMin() {
// ํธ๋ฆฌ๊ฐ ๋น ๊ฒฝ์ฐ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
if (root = null) System.out.println("empty ํธ๋ฆฌ");
root = deleteMin(root);
}
public Node deleteMin(Node n) {
// n์ด ์ต์๊ฐ์ด๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌ
// ์ผ์ชฝ ๋
ธ๋๋ก ํ์ํ๋ฉฐ ๋ด๋ ค์ค๋ค๊ฐ n.getLeft()๊ฐ null์ด ๋๊ธฐ ๋๋ฌธ
// n์ ์ค๋ฅธ์ชฝ ์์ ๊ฐ์ด n์ ์๋ฆฌ๋ฅผ ๋์ฒด
if (n.getLeft() == null) return n.getRight();
// n์ ์ผ์ชฝ ์์์ผ๋ก ์ํ ํธ์ถ
n.setLeft(deleteMin(n.getLeft()));
return n;
}
์ต์๊ฐ์ด ์ญ์ ๋๋ ์ฝ๋๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๊ตฌ์ํด ๋ณด์.
๊ทธ๋ฆผ์์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ ๊ฒฐ๊ตญ 10์ด ์ญ์ ๋๋ ๊ฒฐ๊ณผ์ผ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํด ์ต์๊ฐ์ ๋ฐ๊ฒฌํด์ผ ํ๊ณ , ์ด๋ ์ ์ฝ๋ ์ค deleteMin ๋ฉ์๋๊ฐ ์ํ ํธ์ถ๋๋ ๊ณผ์ ์์ ์ด๋ฃจ์ด์ง๋ค.
๋ง์ฝ n๋ ธ๋๊ฐ ์ต์๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค๋ฉด, ์ต์๊ฐ ์ญ์ ๋ฅผ ์ํด n์ ์ค๋ฅธ์ชฝ ๋ ธ๋๋ฅผ ๋ฐํํด์ผ ํ๋ค.
๊ทธ ์ด์ ๋ ์ผ์ชฝ ๋ ธ๋๋ ์ด์ฐจํผ null ๊ฐ์ผ ๊ฒ์ด๊ณ , ์ค์ํ ๊ฒ์ n์ ์ญ์ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ฅธ์ชฝ ๊ฐ์ด null์ด๋ผ๊ณ ํ๋๋ผ๋ ์ญ์ ์ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ง๋ง์ผ๋ก ์ฐ์์ ์ผ๋ก ๋ถ๋ชจ์ ์์์ ๊ด๊ณ๋ฅผ ์ฌ์ค์ ํ๊ธฐ ์ํด ์ํ ํธ์ถ ํจ์๋ฅผ n.setLeft()๋ก ๊ฐ์ธ์ค๋ค.
์ด์ง ํ์ ํธ๋ฆฌ์ ์ญ์ ์ฐ์ฐ
์ด์ฐ ๋์๋ , ์ด ๋ชจ๋ ๊ฒ์ ์ญ์ ์ฐ์ฐ์ ๊ตฌํํ๊ธฐ ์ํจ์ด๋ค.
์ญ์ ์ ์์ด์ ํ์ฐ์ ์ผ๋ก ์ง์ผ์ ธ์ผ ํ๋ ๊ฒ์ ์ด์ง ํ์ ํธ๋ฆฌ์ ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ญ์ ๋ ๋ ธ๋์ ๋ถ๋ชจ์ ์์ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ฐ๊ฒฐ์์ผ ์ฃผ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ญ์ ๋ ์ด 3๊ฐ์ง ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํด ๋ณผ ์ ์๋ค.
์ฒซ ๋ฒ์งธ๋ ์ญ์ ๋๋ ๋ ธ๋๊ฐ ์์์ด ์๋ ๊ฒฝ์ฐ,
๋ ๋ฒ์งธ๋ ์์์ด ํ๋์ธ ๊ฒฝ์ฐ,
์ธ ๋ฒ์งธ๋ ์์์ด ๋์ธ ๊ฒฝ์ฐ์ด๋ค.
๊ฐ ๊ฒฝ์ฐ๋ ์์๋๋ก ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ํตํด ์ฒ๋ฆฌํ ์ ์๋ค.
1. ์ญ์ ๋ ๋ ธ๋ x์ ๋ถ๋ชจ๊ฐ x๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ํผ๋ฐ์ค๋ฅผ null๋ก ๋ง๋ ๋ค.
- ์ญ์ ํ๋ ค๋ ๋ ธ๋์ ๋ถ๋ชจ์ ์์ ๊ด๊ณ๋ง ์ฒ๋ฆฌํ๋ฉด ๋๋ค. ์ญ์ ๋ ธ๋์ ์์์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
2. x๊ฐ ํ์ชฝ ์์์ธ c๋ง ๊ฐ์ง๊ณ ์์ผ๋ฉด, x์ ๋ถ๋ชจ์ x์ ์์ c๋ฅผ ์ง์ ์ฐ๊ฒฐํ๋ค.
3. x์ ์๋ฆฌ์ ์ค์ ์ํํ๋ฉด์ x๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ์ง์ ๋ ธ๋(์ค์ ์ ํ์) ๋๋ ์งํ์ ๋ฐฉ๋ฌธ๋๋ ๋ ธ๋(์ค์ ํ์์)๋ฅผ ์ด๋ํ๋ค.
1, 2์ ๊ฒฝ์ฐ๋ ์๊ฐํด ๋ณด๊ธฐ ์ฌ์ฐ๋, 3์ ๊ฒฝ์ฐ๋ ๋ค์ ๊น๋ค๋ก์ ๋ณด์ธ๋ค.
์ฝ๋๋ฅผ ํตํด ์ดํดํด ๋ณด์.
public void delete(Key k) { root = delete(root, k); }
public Node delete(Node n, Key k) {
if (n == null) return null;
// ํค๋ฅผ ๋น๊ตํ๋ฉฐ ์ญ์ ๋์์ด ๋๋ ๋
ธ๋์ ์ ๊ทผ
int t = n.getKey().compareTo(k);
// setLeft์ setRight๋ ๋ถ๋ชจ ์์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ์ฌ์ค์ ํ๋ ๋ถ๋ถ!
if (t > 0) n.setLeft(delete(n.getLeft(), k));
else if (t < 0) n.setRight(delete(n.getRight(), k));
// ๋ง์ฝ ์ญ์ ๋์์ด ๋๋ ๋
ธ๋๋ฅผ ๋ฐ๊ฒฌํ์ ๊ฒฝ์ฐ
else {
// ์ญ์ ๋
ธ๋์ ์์ ๋ฆฌํด -> ์ด๋ก์จ ์ญ์ ๋
ธ๋๊ฐ ์ ์ธ๋จ
if (n.getRight() == null) return n.getLeft(); // ์ด ๊ฒฝ์ฐ๋ 1๊ณผ 2์ ๊ฒฝ์ฐ ๋ชจ๋ ํด๋น
// ์ด ๊ฒฝ์ฐ๋ 2์ ๊ฒฝ์ฐ๋ง ํด๋น
// n์ ์ค๋ฅธ์ชฝ ์์์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐํด์ค ์ ์๋ค.(์์ ์กฐ๊ฑด์ ์ํจ)
if (n.getLeft() == null) return n.getRight();
// 3์ ๊ฒฝ์ฐ์ ํด๋น -> ์ ๋ ์กฐ๊ฑด์ ๋ชจ๋ ํต๊ณผํ๊ธฐ ๋๋ฌธ์ด๋ค.
// target = ์ญ์ ํ ๋
ธ๋
Node target = n;
// ์ญ์ ํ ๋
ธ๋์ ๊ตํํ ํ์ ์์ ๋
ธ๋๋ฅผ ์ฐพ์์ผ ํ๋ค.
// ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด ์ญ์ ํ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ๋ด์์ ์ต์๊ฐ์ ์ฐพ๋๋ค.
// ๊ทธ ์ต์๊ฐ์ n์ ํ ๋นํด ์ค๋ค. -> ์ฆ, n์ด ์๋กญ๊ฒ ๊ตฌ์ฑ
n = min(target.getRight());
// ์๋ก์ด ํ ๋น๋ n์ ์ผ์ชฝ ์์๊ณผ ์ค๋ฅธ์ชฝ ์์์ ์๋กญ๊ฒ ํ ๋นํด์ค๋ค.
// ์ด๋, ์ค๋ฅธ์ชฝ ์์ ์ค์ ์, ์ญ์ ๋
ธ๋ ๋์ ๋ค์ด๊ฐ ๋
ธ๋๋ฅผ ์ ๊ฑฐํ์ฌ ์ฌ๊ตฌ์ฑ
// ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์์ ๊ฒฐ๊ตญ ์ญ์ ๋
ธ๋ ๋์ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํด์ฃผ์ด์ผ ํ๋ค.
n.setRight(deleteMin(target.getRight()));
// ์ผ์ชฝ์ ๊ทธ๋๋ก ์ค์
n.setLeft(target.getLeft());
}
return n;
}
๊ฒฐ๊ตญ 3์ ๊ฒฝ์ฐ๋ ์ญ์ ๋ ธ๋ ์์ ์ ๋์ฒดํ ๋ ธ๋๋ฅผ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ๋ด์์ ์ฐพ์ ๋ฐ๊พธ์ด ์ฃผ๋ ๊ฒ์ด ์ ๋ถ์ด๋ค.
์ด์ง ํ์ ํธ๋ฆฌ์ ์ํ ์๊ฐ
์ด์ง ํ์ ํธ๋ฆฌ์์ ๊ฐ ์ฐ์ฐ์ ์ํ ์๊ฐ์ ํธ๋ฆฌ์ ๋์ด์ ๋น๋กํ๋ค. : O(h)
๊ฐ ์ฐ์ฐ์ ๋ฃจํธ์์ ํ์์ ์์ํ์ฌ ์ต์ ์ ๊ฒฝ์ฐ ์ดํ๋ฆฌ๊น์ง ๋ด๋ ค๊ฐ๊ณ , ์ฝ์ ๊ณผ ์ญ์ ์ฐ์ฐ์ ๋ค์ ๋ฃจํธ๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
ํธ๋ฆฌ๋ฅผ 1์ธต ๋ด๋ ค๊ฐ ๋๋ ์ํ ํธ์ถ์ด ๋ฐ์ํ๊ณ 1์ธต์ ์ฌ๋ผ๊ฐ ๋๋ setLeft() ํน์ setRight() ๋ฉ์๋๋ฅผ ์ํํ๋ค. ์ด๋ ๊ฐ๊ฐ์ O(1)์ ์๊ฐ์ด ์์๋๋ค.
๐ค ๊ทธ๋ ๋ค๋ฉด n๊ฐ์ ๋ ธ๋๊ฐ ์๋ ์ด์ง ํ์ ํธ๋ฆฌ์ ๊ฒฝ์ฐ, ๊ฐ์ฅ ์๊ฐ ๋ณต์ก๋๊ฐ ํฐ ๊ฒฝ์ฐ๋ ๋ฌด์์ธ๊ฐ?
๋ฐ๋ก ํธํฅ ์ด์งํธ๋ฆฌ๋ผ๊ณ ํ๋ค. ์ฆ, ํ์ชฝ์ผ๋ก๋ง ํธ๋ฆฌ๊ฐ ์น์ฐ ์ฒ์ ธ ์๋ ํํ์ธ ๊ฒ์ด๋ค.
๋ฐ๋๋ก ์์ ์ด์งํธ๋ฆฌ์ ํํ์ผ ๋ ๊ฐ์ฅ ์๊ฐ ๋ณต์ก๋๊ฐ ์๋ค๊ณ ๋งํ ์ ์๋ค.
๐ค Empty ์ด์ง ํ์ ํธ๋ฆฌ์ ๋๋ค ํค n๊ฐ๋ฅผ ์ฝ์ ํ๋ฉด ํธ๋ฆฌ์ ๋์ด๋ ์ด๋ป๊ฒ ๋๋๊ฐ?
: ์ฝ 1.39 logn