์ค์ํํธ๋ก ๊ตฌํํ๋ ์๋ฃ๊ตฌ์กฐ 7: ํธ๋ฆฌ์ ์ด์ง ํธ๋ฆฌ(Binary Tree)
ํธ๋ฆฌ์ ์ ์
๋จผ์ , ํธ๋ฆฌ์ ๋ํด์ ์ ์ํด๋ณด๋ฉด, ํธ๋ฆฌ๋ ๋ช๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ทธ๋ํ์ ๋๋ค.
1) ํธ๋ฆฌ์ ๊ฐ์ ์๋ ๋ฐฉํฅ์ด ์์ต๋๋ค. ์ฆ, ํธ๋ฆฌ๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ ๋๋ค.
2) ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋ชจ๋ ๋ ธ๋๋ ์ฐ๊ฒฐ๋์ด ์๋ ์ฐ๊ฒฐ ๊ทธ๋ํ์ ๋๋ค. ์ฐ๊ฒฐ๋ ๊ฐ์ ์ค ํ๋๋ง ์ญ์ ํด๋ ์ฐ๊ฒฐ ๊ทธ๋ํ๊ฐ ๊นจ์ง๋๋ค.
-> ์ฌ๊ธฐ์ ์ฐ๊ฒฐ๊ทธ๋ํ๋ ๊ทธ๋ํ์ ์์์ ๋ ธ๋ ์ฌ์ด์ ํญ์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํจ์ ์๋ฏธํฉ๋๋ค. ์ด๋ค ๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์์ด์ง๋ฉด ํด๋น ๋ ธ๋๋ ํธ๋ฆฌ์ ํฌํจ๋ ์ ์๊ฒ ์ฃ ?
3) ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ์ ์ ๊ฐ์๋ ํญ์ ๋ ธ๋์ ๊ฐ์๋ณด๋ค ํ๋ ์ ์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
์ด์ง ํธ๋ฆฌ (Binary Tree)
์ด์ง ํธ๋ฆฌ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ ๋ ธ๋๊ฐ ์ต๋ ๋ ๊ฐ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง๋ ํธ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด์ง ํธ๋ฆฌ์ ์ข ๋ฅ
์ด์ง ํธ๋ฆฌ๋ ํํ์ ๋ฐ๋ผ์ ๋ช ๊ฐ์ง ์ข ๋ฅ๋ก ๋๋ ์ ์์ต๋๋ค.
ํฌํ ์ด์ง ํธ๋ฆฌ
ํฌํ ์ด์ง ํธ๋ฆฌ๋ ์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ง์ง๋ง ๋ฆฌํ๋ ธ๋๋ฅผ ๊ฐ์ง ๋ ๋ฒจ์ด ๋ ธ๋๋ฅผ ๋ ์ถ๊ฐํ ์ ์๋ ๊ณต๊ฐ์์ด ๊ฐ๋ ์ฐจ ์๋ ์ด์ง ํธ๋ฆฌ๋ฅผ ๋งํฉ๋๋ค. ๋ฐ๋ผ์ ํฌํ ์ด์ง ํธ๋ฆฌ์ ๋ ธ๋ ๊ฐ์๋ ํญ์ ํธ๋ฆฌ์ ๋์ด h์ ๋ํด 2^h - 1 ๊ฐ๊ฐ ๋ฉ๋๋ค.
์์ ์ด์ง ํธ๋ฆฌ
์์ ์ด์ง ํธ๋ฆฌ๋ ๋ชจ๋ ๋ ๋ฒจ์ด ์ผ์ชฝ๋ถํฐ ์ฑ์์ ธ์๋ ํธ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ ๊ทธ๋ฆผ ์ฒ๋ผ ํ ๋ ๋ฒจ์ด ๊ฐ๋ ์ฑ์์ง์ง ์์๋ 8๋ฒ ๋ ธ๋๊ฐ ๊ฐ์ฅ ์ผ์ชฝ์ ์ฑ์์ ธ ์๊ธฐ ๋๋ฌธ์ ์์ ์ด์ง ํธ๋ฆฌ๊ฐ ๋ฉ๋๋ค.
๋ฐ๋ฉด์ ์ด๋ฐ ๊ฒฝ์ฐ๋ ์ผ์ชฝ์ ์์ง ์ฑ์์ง์ง ์์ ๊ณต๊ฐ์ด ์์์๋ ์ค๊ฐ๋ถํฐ ๋ ธ๋๊ฐ ๋ค์ด๊ฐ์๊ธฐ ๋๋ฌธ์ ์์ ์ด์ง ํธ๋ฆฌ๊ฐ ๋ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋๋ก ์ฑ์ฐ๋ ์์ ์ด์ง ํธ๋ฆฌ ํน์ฑ ๋๋ฌธ์ ์์ ์ด์ง ํธ๋ฆฌ๋ ๋ฐฐ์ด๋ก ์ฝ๊ฒ ํํํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ๋ฐฐ์ด์ 0๋ฒ์งธ ์์๋ฅผ ๋น์๋ ์ฑ๋ก 1๋ฒ ์ธ๋ฑ์ค๋ฅผ ๋ฃจํธ๋ ธ๋๋ก ๋ง๋ค๋ฉด ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๋ ํ์ฌ ์ธ๋ฑ์ค i์ ๋ํด i * 2 ๋ก ์ฐพ์๊ฐ ์ ์๊ณ , ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๋ i * 2 + 1 ๋ก ์ฐพ์๊ฐ ์ ์์ต๋๋ค.
ํธํฅ ์ด์ง ํธ๋ฆฌ
ํธํฅ ์ด์ง ํธ๋ฆฌ๋ ํธ๋ฆฌ์ ๋ ธ๋๊ฐ ํ์ชฝ ์์ ๋ ธ๋๋ก๋ง ๊ณ์ ์ฐ๊ฒฐ๋๋ฉด์ ๋ ธ๋์ ๊ฐ์๋ ์ ์ง๋ง ํธ๋ฆฌ์ ๋์ด๋ ์ปค์ง๋ ๋ชจ์ต์ ํธ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด์ง ํธ๋ฆฌ ์ํ
์ด์ง ํธ๋ฆฌ๋ ํธ๋ฆฌ์ ํธ๋ฆฌ์ ํฌํจ๋ ์๋ธ ํธ๋ฆฌ๋ค์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ธ์ ๋ฐฉ๋ฌธํ๋์ง์ ๋ฐ๋ผ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํธ๋ฆฌ์ ์ ์ฒด ๋ ธ๋๋ฅผ ์ํํ ์ ์์ต๋๋ค.
์ ์ ์ํ
์ ์ ์ํ๋ ๋ค๋ฅธ ๋ ธ๋๋ค์ ๋ฐฉ๋ฌธ ํ๊ธฐ ์ด์ ์ ๋ฃจํธ๋ ธ๋๋ฅผ ๋จผ์ ๋ฐฉ๋ฌธํ๋ ์ํ๋ฐฉ์์ ๋๋ค. ๋ฃจํธ -> ์ผ์ชฝ -> ์ค๋ฅธ์ชฝ ์์ผ๋ก ํธ๋ฆฌ์ ๋ ธ๋๋ค์ ๋ฐฉ๋ฌธํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
์ด ํธ๋ฆฌ๋ฅผ ์ ์ ์ํํ๋ฉด A->B->D->E->C->F->G ์ ์์๋๋ก ๋ฐฉ๋ฌธํ๊ฒ ๋ฉ๋๋ค. ๋ณด์ด๋ฏ์ด ์ด๋ค ๋ ธ๋์ ์๋ธํธ๋ฆฌ๋ฅผ ์ํํ ๋๋ ํด๋น ๋ ธ๋์ ์ผ์ชฝ์ ๋ชจ๋ ์๋ธํธ๋ฆฌ๊ฐ ์๋ฃ๋์ด์ผ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ์ํํ๊ฒ ๋ฉ๋๋ค.
์ค์ ์ํ
์ค์ ์ํ๋ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ค๊ฐ์ ๋ฐฉ๋ฌธํ๋ ์ํ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ผ์ชฝ->๋ฃจํธ->์ค๋ฅธ์ชฝ์ ์์๋๋ก ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋ฉ๋๋ค.
์ ์์์ ๋์ผํ ํธ๋ฆฌ๋ฅผ ์ค์ ์ํํ๊ฒ ๋๋ฉด D->B->E->A->F->C->G์ ์์๋๋ก ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํฉ๋๋ค.
ํ์ ์ํ
ํ์ ์ํ๋ ๋ฃจํธ ๋ ธ๋๋ฅผ ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ๋ฐฉ๋ฌธํ๋ ์ํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ํ์์ด ํญ์ ์ค๋ฅธ์ชฝ๋ณด๋ค ์ ํ๋๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ->์ค๋ฅธ์ชฝ->๋ฃจํธ์ ์์๋๋ก ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋ฉ๋๋ค.
๋์ผํ ํธ๋ฆฌ๋ฅผ ํ์ ์ํํ๋ฉด D->E->B->F->G->C->A์ ์์๋๋ก ๋ฐฉ๋ฌธํ๊ฒ ๋ฉ๋๋ค. ์๋ธํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฃจํธ ๋ ธ๋๋ ์์ ์ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์์๋ ธ๋๊ฐ ๋ชจ๋ ๋ฐฉ๋ฌธ ๋ ์ดํ์ ๋ฐฉ๋ฌธ๋ฉ๋๋ค.
์์ ์ด์ง ํธ๋ฆฌ ๊ตฌํํ๊ธฐ
์ด์ ์ ํ์ ๊ตฌํํ๋ฉด์ ์ด๋ฏธ ์์ ์ด์งํธ๋ฆฌ๋ฅผ ๊ตฌํํ์ง๋ง, ์ด๋ฒ์๋ ๋งํฌ๋ ๋ฆฌ์คํธ๋ก ๊ตฌํํด ์ ์, ์ค์, ํ์ ์ํ๊น์ง ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ผ๋ ๋ง๋ค๊ธฐ
TreeNode
๋จผ์ ํธ๋ฆฌ์ ๋ ธ๋๊ฐ ๋ ์๋ฃ๊ตฌ์กฐ๋ถํฐ ์ ์ํ๊ฒ ์ต๋๋ค.
import Foundation
final class TreeNode<T: Comparable> {
let data: T
var leftChild: TreeNode?
var rightChild: TreeNode?
init(data: T) {
self.data = data
}
var asString:String { return treeString(self){("\($0.data)",$0.leftChild,$0.rightChild)} }
}
์ด๋ ๊ฒ ๊ตฌ์ฑํ๋๋ฐ์, data์๋ ํธ๋ฆฌ์ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ์์ ์ ์ผ์ชฝ ์์ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ์ฐธ์กฐ๊ฐ์ ์ ์ฅํ ์ ์๋๋ก ํ์ต๋๋ค.
asString ํ๋กํผํฐ๋ ํธ๋ฆฌ๋ฅผ ์์ฒญ ์์๊ฒ ์ถ๋ ฅํด์ฃผ๋ treeString ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ฐ ์ด๊ฑด ์คํ ์ค๋ฒํ๋ก์ฐ์์ ์ง์ง ์ ๋ง๋ค์ด์ฃผ์ ๋ถ์ด ๊ณ์ ์ ๊ทธ๋๋ก ์ฌ์ฉํ์ด์!
์ด ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ๋ฉ์๋๊ฐ ์ ์๋์ด ์๊ตฌ์,
์ ์ฉํ๋ฉด ์ด๋ ๊ฒ ์์๊ฒ ์ฝ์์ ํธ๋ฆฌ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค!
๋ ธ๋ ์ถ๊ฐ
์ด๋ฒ ๊ตฌํ์์๋ ๋ค๋ฅธ ์ฐ์ฐ์ ๊ตฌํํ์ง ์๊ณ (์ด์ง ํธ๋ฆฌ์ ๋ํด์๋ ์ ํํ๋ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์) ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ ์ฐ์ฐ๋ง ๊ตฌํํ ๋ค์ ์ํ ํจ์๋ฅผ ๊ตฌํํ๊ณ ํธ์ถ๋ง ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์์ ์ด์งํธ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ํญ์ ๊ฐ์ฅ ์ผ์ชฝ ๋ถํฐ ์ฐจ๋ก๋๋ก ๋ ธ๋๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผ๊ฒ ์ฃ ?
private func add(newNode: TreeNode<T>, to node: TreeNode<T>) {
var queue = Queue<TreeNode<T>> ()
queue.push(root!)
while !queue.isEmpty {
let now = queue.pop()
if now?.leftChild == nil {
now?.leftChild = newNode
return
}
if now?.rightChild == nil {
now?.rightChild = newNode
return
}
queue.push(now!.leftChild!)
queue.push(now!.rightChild!)
}
}
๊ทธ๋์ ์ด๋ ๊ฒ BFS๋ฅผ ์ฌ์ฉํด์ ํธ๋ฆฌ๋ฅผ ์ํํด์ฃผ๊ณ , ์์ง ์์ ๋ ธ๋๊ฐ ์์ ํ ์ฑ์์ง์ง ์์ ๋ ธ๋๋ฅผ ๋ง๋๋ฉด ์ผ์ชฝ ์์ ๋ ธ๋๋ถํฐ ์ฑ์์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ต๋๋ค. ์ฌ์ค ๊ทธ๋ํ์ ๋ํ ํฌ์คํธ๋ฅผ ์์จ์ BFS๋ฅผ ์ฌ๊ธฐ์ ์๊ฐํ๋๊ฒ ๋ง์๊น ์ถ์ง๋ง.. BFS์ ๋ํ ๋ด์ฉ์ ์ฌ๊ธฐ์ ์ ๋ฆฌ๋์ด ์์ผ๋ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ ๋ชจ๋ฅด์๊ฒ ๋ค๋ฉด ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์์!
ํธ๋ฆฌ ์ํ
ํธ๋ฆฌ์ ์ํ๋ ์ฌ๊ท์ ์ธ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ๊ทธ๋ฐ๋ฐ ์๊ฐํด๋ณด๋ฉด ์ฌ์ค ์ผ์ชฝ ์์ ๋ ธ๋๋ ํญ์ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๋ณด๋ค ๋จผ์ ๋ฐฉ๋ฌธ ๋๋, ๋ฃจํธ๋ ธ๋๋ฅผ ์ธ์ ๋ฐฉ๋ฌธํ๋์ง๋ง ๋ค๋ฅด๊ฒ ๊ตฌํํด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋จผ์ ์ ์ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ์ฝ๋์ ๋๋ค!
private func printPreorder(node: TreeNode<T>?) {
guard let node = node else { return }
print(node.data, terminator: " ")
self.printPreorder(node: node.leftChild)
self.printPreorder(node: node.rightChild)
}
์ฌ๊ท์ ์ผ๋ก ์ ์ ์ํ๋ฅผ ์งํํ๋ฉด์ ์ถ๋ ฅ์ ํด์ฃผ๋๋ฐ์, ๋ฃจํธ ๋ ธ๋๋ฅผ ๋จผ์ ์ถ๋ ฅํด์ฃผ๊ณ ์ผ์ชฝ ์์ ๋ ธ๋๊ฐ ๋ฃจํธ ๋ ธ๋์ธ ์๋ธํธ๋ฆฌ๋ก ์ด๋ํด ์ํ๋ฅผ ๋ชจ๋ ๋ง์น๋ค, ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๊ฐ ๋ฃจํธ ๋ ธ๋์ธ ์๋ธํธ๋ฆฌ๋ก ์ด๋ํด ์ํ๋ฅผ ๋ง์น๊ณ ๋์์ค๋ ์ฝ๋์ ๋๋ค.
์ด๋ฐ ํธ๋ฆฌ๊ฐ ์๋ค๋ฉด ๋จผ์ A๋ฅผ ์ถ๋ ฅํด์ฃผ๊ณ , B๋ฅผ ๋ฃจํธ๋ก ๊ฐ์ง๋ ์๋ธํธ๋ฆฌ๋ก ์ด๋ํ ํ ๋ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ๋ ์๋ก์ด ํจ์๋
์ด ์๋ธํธ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ๋ค์ ๋๊ฐ์ ๋ก์ง์ ์ํํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ B๋ฅผ ์ถ๋ ฅํ๊ณ ์ผ์ชฝ ์์๋ ธ๋๋ฅผ ๋ฃจํธ๋ก ๊ฐ์ง๋ ์๋ธํธ๋ฆฌ๋ก ์ฌ๊ท ํธ์ถ์ ํ๋
์ด๋ฒ์ ์์ ๋ ธ๋๊ฐ ์๋ ๋ฆฌํ๋ ธ๋๋ฅผ ๊ฐ์ง๊ณ ๋ก์ง์ ์ํํฉ๋๋ค. ์ฌ๊ธฐ์ D๋ฅผ ์ถ๋ ฅ ํ๊ณ ์ฌ๊ท์ ์ผ๋ก ํ ๋ฒ ๋ ํธ์ถํ์ง๋ง nil์ด ๋ฃจํธ์ด๊ธฐ ๋๋ฌธ์ ํจ์๊ฐ ๋ฆฌํด๋๋ฉด์ ๋ชจ๋ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์ํ๋ฅผ ๋ง์น๊ฒ ๋ฉ๋๋ค.
์ด ์์ ์ด ์ ์ฒด ํธ๋ฆฌ์ ๋ํด์ ์๋ฃ๋๋ฉด ์ ์ ์ํ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
์ค์ ์ํ
๋ก์ง์ ๋์ผํ๋ ๊ทธ๋ฆผ์ ์ด์ ์๋ตํ๊ฒ ์ต๋๋ค..
private func printInorder(node: TreeNode<T>?) {
guard let node = node else { return }
self.printInorder(node: node.leftChild)
print(node.data, terminator: " ")
self.printInorder(node: node.rightChild)
}
์ค์ ์ํ์ ๋ก์ง์ ์ ์ ์ํ์ ๊ฑฐ์ ๋์ผํ๋ฐ์, ๋จ์ํ ๋ฃจํธ ๋ ธ๋์ ์ถ๋ ฅ์ด ์ผ์ชฝ ์์ ๋ ธ๋๋ฅผ ๋ฃจํธ๋ก ๊ฐ์ง๋ ์๋ธํธ๋ฆฌ์ ์ํ๊ฐ ๋ชจ๋ ๋๋์ผ ์ด๋ฃจ์ด์ง๋ค๋ ๊ฒ๋ง ๋ค๋ฆ ๋๋ค.
ํ์ ์ํ
private func printPostorder(node: TreeNode<T>?) {
guard let node = node else { return }
self.printPostorder(node: node.leftChild)
self.printPostorder(node: node.rightChild)
print(node.data, terminator: " ")
}
ํ์ ์ํ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ํ์ ์ํ๋ ์ผ์ชฝ์ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ์ํ๊ฐ ๋ชจ๋ ๋๋ ๋ค์ ๋ฃจํธ๋ ธ๋๋ฅผ ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ ๋ฃจํธ๋ ธ๋๋ฅผ ์ถ๋ ฅํ๋ ์ฝ๋๋ฅผ ์ฌ๊ท ํจ์์ ๊ฐ์ฅ ๋ค์ ๋ฃ์ด์ฃผ๋ ๊ฒ๋ง ๋ณ๊ฒฝ๋์์ต๋๋ค.
์ ์ฒด ์ฝ๋
์๋ฃ๊ตฌ์กฐ ์๋ฆฌ์ฆ์ ์ฝ๋๋ค์ ์ด ๋ ํฌ์์ ๋ชจ๋ ํ์ธํ ์ ์์ด์!
'๐ฎ ์จ-์์ค > ๐ฆด ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote