TIL์ ์ฐ๋๋ฐ ๋๋ฌด ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์, ๋งค์ผ ๊ธฐ๋กํ๊ธฐ ์ํด์ , ์กฐ๊ธ ๋จ์ํํ๊ธฐ๋ก ํ์๋ค.
์คํ๊ณผ ํ์ ๊ฐ๋ ์ ๋ํด์๋ ๊ธฐ์กด์ ๊ธ์ ์ฐธ๊ณ ํ์.
[ํ์ด์ฌ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ๊ตฌ์กฐ] 1. ์คํ๊ณผ ํ
* ์ด ๊ธ์ ๋ค์ด๋ฒ ๋ถ์คํธ ์ฝ์ค์ ์ธ๊ณต์ง๋ฅ(AI) ๊ธฐ์ด ๋ค์ง๊ธฐ ๊ฐ์๋ฅผ ์๊ฐํ๋ฉฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ์ฌ๋ด) ์ผ๋ง์ ์ธํด ๋ชจ์๋ฉด์ ์ ์ฐ์ฐํ ์ฐธ์ฌํ ๊ธฐํ๊ฐ ์๊ฒผ๋๋ฐ ์คํ๊ณผ ํ๋ฅผ ํท๊ฐ๋ ค๋ฒ๋ ธ๋ค. ํ๋ก์
steady-eschoi.tistory.com
1) ์คํ
ํ์ํ๊ธฐ๋ฒ
ํ์ํ๊ธฐ๋ฒ์ ๋ํ์ ์ผ๋ก ์คํ์ ํ์ฉํ์ฌ ํธ๋ ๋ฌธ์ ์ด๋ค.
- ์ค์ ํ๊ธฐ๋ฒ(infix notation) : ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์๋ค ์ฌ์ด์ ์์น
(A+B)*(C-D)
- ํ์ ํ๊ธฐ๋ฒ(postfix notation) : ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์๋ค ๋ค์ ์์น
AB+CD-* : ์์ ์ฐ์ฐ์๋ถํฐ ์ฒ๋ฆฌ
- ์ ์ ํ๊ธฐ๋ฒ(prefix notation) : ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์๋ค ์์ ์์น
*+AB-CD
๊ฐ์์์๋ ์ค์ํ๊ธฐ๋ฒ → ํ์ํ๊ธฐ๋ฒ์ ์คํ์ ์ด์ฉํด์ ๋ณํํ์๋ค
(์ค์ ํ๊ธฐ๋ฒ -> ํ์ ํ๊ธฐ๋ฒ ๋ณํ) ๋ก์ง
์ฐ์ฐ์ ์ฐ์ ์์๋ฅผ ๊ณ ๋ คํ๋ค.
ํผ์ฐ์ฐ์ : ์ถ๋ ฅ
์ฐ์ฐ์ : ์ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ์ถ๋ ฅ
- ์คํ์ push : ์คํ ๋งจ ์์ ์ฐ์ฐ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ผ๋ฉด
- ์คํ์์ pop : ์ฌ๋ ๊ดํธ๊ฐ ๋์จ ๊ฒฝ์ฐ, ์ฐ์ ์์๊ฐ ๊ฐ๊ฑฐ๋ ๋ฎ์ ๊ฒฝ์ฐ, ๋จ์์๋ ์์ด ์๋ ๊ฒฝ์ฐ ๋ชจ๋ pop
์ฐ์ฐ์ ์ฐ์ ์์ ํ ์ด๋ธ(prec)
3 | * | / |
2 | + | - |
1 | ( |
์ฝ๋
def infixToPostfix(tokenList):
prec = {
'*': 3,
'/': 3,
'+': 2,
'-': 2,
'(': 1,
}
opStack = ArrayStack()
postfixList = []
for token in tokenList:
if token=='(':
opStack.push(token)
elif token==')':
while opStack.peek()!='(':
postfixList.append(opStack.pop())
opStack.pop()
elif token not in prec.keys():
postfixList.append(token)
else:
if opStack.isEmpty():
opStack.push(token)
else:
#์ฐ์ฐ์ ์ฐ์ ์์ ๊ฐ๊ฑฐ๋ ์์ผ๋ฉด pop
while opStack.isEmpty()!=True and prec[opStack.peek()]>=prec[token]:
postfixList.append(opStack.pop())
opStack.push(token)
#๋น ์คํ์ด ๋ ๋๊น์ง ์ถ๋ ฅ
while opStack.isEmpty()!=True:
if opStack not in ['(', ')']:
postfixList.append(opStack.pop())
else:
opStack.pop()
return postfixList
(ํ์ํ๊ธฐ๋ฒ ๊ณ์ฐ) ๋ก์ง
ํผ์ฐ์ฐ์ : ์คํ์ ์ฝ์
์ฐ์ฐ์ : ์คํ์ top, top-1 ๊ฐ์ ์ด์ฉํ์ฌ ๊ณ์ฐํ ๋ค ๋ค์ push
* ์ด๋, ์ฃผ์ํ ๊ฒ์ top-1 (์ฐ์ฐ์) top ์์์ฌ์ผ ํจ์ ์ ์ํ์(๋บ์ , ๋๋์ ์ ํผ์ฐ์ฐ์์ ์์๋ฅผ ๋ค๋ฅด๊ฒ ํ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค)
ํ์ ํ๊ธฐ๋ฒ์ด๋ฏ๋ก ์ฐ์ฐ์๋ ์์๋๋ก ๊ณ์ฐํ๋ฉด ๋๋ค.
์ฝ๋
def postfixEval(tokenList):
valStack = ArrayStack()
for token in tokenList:
if type(token) is int:
valStack.push(token)
elif token == '*':
num2 = valStack.pop()
num1 = valStack.pop()
valStack.push(num1 * num2)
elif token == '/':
num2 = valStack.pop()
num1 = valStack.pop()
valStack.push(num1 / num2)
elif token == '+':
num2 = valStack.pop()
num1 = valStack.pop()
valStack.push(num1 + num2)
elif token == '-':
num2 = valStack.pop()
num1 = valStack.pop()
valStack.push(num1 - num2)
return valStack.pop()
2) ํ
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
ํ์ ๊ธฐ๋ณธ์ ์ธ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ฉ
์๋ฃ๋ฅผ ์์ฑํ๋ ์์ ๊ณผ ๊ทธ ์๋ฃ๋ฅผ ์ด์ฉํ๋ ์์ ์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ผ์ด๋๋ ๊ฒฝ์ฐ
์๋ฃ๋ฅผ ์ด์ฉํ๋ ์์ ์ด ์ฌ๋ฌ ๊ณณ์์ ์ผ์ด๋๋ ๊ฒฝ์ฐ
์๋ฃ์ ์ฒ๋ฆฌ๊ฐ ์์ฐจ์ ์ผ๋ก ์ผ์ด๋์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ค.
๋ณดํต ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๊ฐ ๋ฌดํํ์ง ์์ผ๋ฏ๋ก ์ํํ๋ฅผ ์ด์ฉํด์ ํฌ๊ธฐ๋ฅผ ์ ํํ๋ค.
์ํ ํ(Circular Queue)
์ํํ๋ ์ฌ์ฉํ ์ ์๋ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ์ ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ค์์ ํจ์๋ฅผ ์ด์ฉํ๋ค.
isFull():Boolean
- front : ํ์ ์ ์ผ ๋จผ์ ๋ค์ด๊ฐ ์์๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- rear : ํ์ ์ ์ผ ๋์ค์ ๋ค์ด๊ฐ ์์๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์์ ํฌ์ธํฐ์ ํจ์๋ฅผ ์ด์ฉํด์ ํจ์๋ฅผ ๊ตฌํํ ์ ์๋๋ฐ, ๋ฐฐ์ด์ ์ด์ฉํ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ 0~(n-1)๊น์ง์ด๋ค. ๋ฐ๋ผ์ ํฌ์ธํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฐ์ฐ์ ํ ๋, (front or rear)%maxCount ์ฒ๋ฆฌํด์ผ ํ๋ค.
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
์ฐ์ ์์ ํ(Priority Queue)
ํ์ ๋ฐฉ์์ ๋ฐ๋ฅด์ง ์๊ณ , ์์๋ค์ ์ฐ์ ์์์ ๋ฐ๋ผ ํ์์ ๋น ์ ธ๋์ค๋ ํ์
์ฝ์ ์์๋ ์ฐ์ ์์ ๋ฎ์ ๊ฒ๋ถํฐ → ํฐ ๊ฒ์ผ๋ก ์ด๋ฃจ์ด์ง๋ฏ๋ก pop ์ฐ์ฐ๋ ๋์ผํ๊ฒ ์ผ์ด๋๋ค.
ํ์ฉ
์ด์์ฒด์ ์ CPU ์ค์ผ์ฅด๋ฌ
๊ตฌํ
- Enqueue ํ ๋ ์ฐ์ ์์ ์์๋ฅผ ์ ์งํ๋๋ก
- Dequeue ํ ๋ ์ฐ์ ์์ ๋์ ๊ฒ์ ์ ํ
2๋ฒ์ ๊ฒฝ์ฐ ํ์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ดํด๋ด์ผ ํ๋ฏ๋ก 1๋ฒ ๋ฐฉ์์ด ์กฐ๊ธ ๋ ์ ๋ฆฌํ๋ค.
- ์ ํ ๋ฐฐ์ด ์ด์ฉ
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ด์ฉ
Enqueue ํ ๋ ์ฐ์ ์์ ์์๋ฅผ ์ ์งํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ ํํ๋ฉด, ๋ฐฐ์ด๋ณด๋ค๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค. ๊ทธ ์ด์ ๋ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ์ค๊ฐ์ ์ฝ์ ํ๋ฉด ์ดํ์ ๋ชจ๋ ์์๋ค์ ํ ์นธ์ฉ ๋ค๋ก ์ด๋์์ผ์ผ ํ์ง๋ง, ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๋จ์ํ ์ ๋ค์ ์ฐ๊ฒฐ๋ง ๋ฐ๊พธ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
3) ํธ๋ฆฌ
๊ทธ๋ํ์ ์ผ์ข ์ผ๋ก, ๋ ธ๋๊ฐ ์ฃ์ง๋ก ์ฐ๊ฒฐ๋์ด ์๋ ์๋ ์๋ฃ๊ตฌ์กฐ
์ฉ์ด
- ๋ฃจํธ ๋ ธ๋ (root node) : ๊ฐ์ฅ ์์ ์์นํ ๋ ธ๋
- ๋ฆฌํ ๋ ธ๋ (leaf nodes) : ์์ ๋ ธ๋๊ฐ ์๋ ๋ ธ๋ = degree๊ฐ 0์ธ ๋ ธ๋
- ๋ด๋ถ ๋ ธ๋ (internal nodes) : ๋ฃจํธ, ๋ฆฌํ ๋ ธ๋๊ฐ ์๋ ๋๋จธ์ง์ ๋ ธ๋
- ๋ถ๋ชจ (parent) ๋ ธ๋ : ํ๋์ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ์์ ๋ ธ๋
- ์์ (child) ๋ ธ๋ : ํ๋์ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ํ์ ๋ ธ๋
- ๋ ธ๋์ ์์ค (level) : ๋ฃจํธ ๋ ธ๋ ๊ธฐ์ค 0์ผ๋ก, ๋ฃจํธ ๋ ธ๋์์๋ถํฐ ๋ช ๊ฐ์ ๊ฐ์ ์ ๊ฑฐ์น๋์ง(๊ฑฐ๋ฆฌ)
- ๋ ธ๋์ ์ฐจ์ (degree) : ์์ ๋ ธ๋์
- ํธ๋ฆฌ์ ๋์ด (height) , ๊น์ด (depth) : ํธ๋ฆฌ์ ์ต๋ ์์ค(level)+1
- ๋ถ๋ถ ํธ๋ฆฌ (์๋ธํธ๋ฆฌ; subtrees) : ํธ๋ฆฌ์ ์ผ๋ถ
์ด์งํธ๋ฆฌ(binary tree)
๋ชจ๋ ๋ ธ๋์ ์ฐจ์๊ฐ 2 ์ดํ์ธ ํธ๋ฆฌ
ํฌํ ์ด์งํธ๋ฆฌ (full binary trees)
๋ชจ๋ ๋ ๋ฒจ์์ 2๊ฐ์ ์์ ๋ ธ๋๋ค์ด ๋ชจ๋ ์ฑ์์ ธ ์๋ ์ด์งํธ๋ฆฌ
์์ ์ด์งํธ๋ฆฌ (complete binary trees)
๋์ด๊ฐ k๋ผ๊ณ ๊ฐ์ ํ๋ค๋ฉด,
k-2๋ฒ์งธ ๋ ๋ฒจ์ ์์ ๋ ธ๋๊ฐ ๋ 2๊ฐ์ด๊ณ ,
k-1๋ฒ์งธ ๋ ๋ฒจ์ ์์ ๋ ธ๋๊ฐ ์ผ์ชฝ๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ฑ์์ ธ ์๋ ์ด์ง ํธ๋ฆฌ
๊ตฌํ
์ด์งํธ๋ฆฌ๋ฅผ ๋งํฌ๋๋ฆฌ์คํธ๋ก ๊ตฌํํด ๋ณด์.
๋ ธ๋์ ํธ๋ฆฌ์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
- size() : ์ ์ฒด ๋ ธ๋์ ๊ฐ์ = left์๋ธํธ๋ฆฌ+right์๋ธํธ๋ฆฌ+root๋ ธ๋
- depth() : max(left์๋ธํธ๋ฆฌ์ depth, right ์๋ธํธ๋ฆฌ์ depth)+1
- traverse()
- ๊น์ด ์ฐ์ ์ํ(์ฌ๊ท์ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ)
- ์ค์ ์ํ(inorder traversal) : left → root → right
- ์ ์ ์ํ(preorder traversal) : root → left → right
- ํ์ ์ํ(postorder traversal) : left → right → root
- ๋์ด ์ฐ์ ์ํ : ์์ค์ด ๋ฎ์ ๋ ธ๋๋ถํฐ ๋ฐฉ๋ฌธ(๋ฃจํธ๋ ธ๋ →๋ถ๋ชจ๋ ธ๋ →์์๋ ธ๋)
- ๊น์ด ์ฐ์ ์ํ(์ฌ๊ท์ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ)
์ด์งํ์ํธ๋ฆฌ(binary search tree tree)
๋ชจ๋ ๋ ธ๋๋ค์ด ์๋์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ด์งํธ๋ฆฌ
- ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ๋ ๋ชจ๋ ํ์ฌ ๋ ธ๋์ ๊ฐ๋ณด๋ค ์๊ณ
- ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์๋ ๊ฐ์ ๋ชจ๋ ํ์ฌ ๋ ธ๋์ ๊ฐ๋ณด๋ค ํฐ
๊ทธ๋ ๋ค๋ฉด, ์ ์ด์งํ์ ํธ๋ฆฌ๋ฅผ ์ฐ๋์ง๋ฅผ ์์๋ณด์. ๊ทธ๋ฌ๊ธฐ ์ํด์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ด์ฉํ ํ์์ ๋นํด ์ด์ง ํ์์ด ๊ฐ๋ ์ด์ ์ ์ฐพ์๋ณด์.
ํธ๋ฆฌ๊ตฌ์กฐ์ด๋ฏ๋ก ๋ฐ์ดํฐ ์์์ ์ถ๊ฐ, ์ญ์ ๊ฐ ์ฉ์ดํ์ง๋ง, ๊ณต๊ฐ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๊ณ ํ๊ท O(log n)์ ํ์ ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
๋ณดํต ํ์ชฝ์ผ๋ก ์น์ฐ์น๋ ์ด์งํธ๋ฆฌ์ ๊ฒฝ์ฐ ํ์์ ๋งค์ฐ ๋ถ๋ฆฌํ๋ค.
(๋ฐ๋ผ์ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ด๊ฒ ํ๋, ๋์ด์ ๊ท ํ์ ์ ์งํ๊ฒ ํ๋ ์ด์งํธ๋ฆฌ ์ฐ์ฐ๋ค์ด ์๋ค tradeoff-์ฝ์ , ์ญ์ ๊ฐ ๋ ์ ์ฐ)
- AVL tree
- Red-black tree
๊ตฌํ
์ด์ง ํ์ํธ๋ฆฌ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋ ธ๋์ ์ด์งํ์ํธ๋ฆฌ์ ํด๋์ค๋ค์ด์ด๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ๋ค
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
- insert(key, data) : ํธ๋ฆฌ์ key ์๋ฆฌ์ ๋ฐ์ดํฐ ์์๋ฅผ ์ถ๊ฐ
- key๊ฐ ์์ ๊ฒฝ์ฐ → ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ก ๋ด๋ ค๊ฐ ์ฐ์ฐ ์ํ or ์ผ์ชฝ์ ์ฝ์
- key๊ฐ ํฐ ๊ฒฝ์ฐ → ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ก ๋ด๋ ค๊ฐ ์ฐ์ฐ ์ํ or ์ค๋ฅธ์ชฝ์ ์ฝ์
- key๊ฐ ๊ฐ์ ๊ฒฝ์ฐ → keyError ๋ฐ์
- remove(key) : ํธ๋ฆฌ์ key ๋ฐ์ดํฐ ์์๋ฅผ ์ญ์
- ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ๊ฒฝ์ฐ → parent์ ์ฐ๊ฒฐ๋ง ๋๊ธฐ
- ์์ ๋ ธ๋๋ฅผ ํ๋ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ → ์์ ๋ ธ๋๋ฅผ parent์ ์ฐ๊ฒฐ
- ์์ ๋ ธ๋๋ฅผ ๋ ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ → ๊ทธ๋ค์ ํค๋ฅผ ๊ฐ์ง ์์ ๋ ธ๋๋ฅผ parent์ ์ฐ๊ฒฐ
- lookup(key) : key์ ํด๋นํ๋ ๋ ธ๋์ ๋ถ๋ชจ๋ ธ๋๋ฅผ ๋ฐํ
- inorder() : key์ ์์๋๋ก ๋ฐ์ดํฐ ์์๋ฅผ ๋์ด
- min() : ์ต์ํค๋ฅผ ๊ฐ์ง๋ ์์ ํ์
- max() : ์ต๋ํค๋ฅผ ๊ฐ์ง๋ ์์ ํ์
๋ชจ๋ ์ฝ๋๋ ๊นํ๋ธ๋ฅผ ์ฐธ๊ณ ํ์.