ํธ๋ฆฌ ๋ถ์ผ: ์ธ๊ณต์ง๋ฅ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์๋ ์์ฑ ์์คํ ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ์ฌ์ฉ
ํธ๋ฆฌ๋ ์์ง๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋๋ก ๊ตฌ์ฑ๋ ๊ณ์ธต ๊ตฌ์กฐ
- ๋ ธ๋: ๊ฐ ๋ ธ๋์๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด ์๋ค.
- ๋ฃจํธ: ์ต์์ ๋ ธ๋๋ก, ๋ถ๋ชจ๊ฐ ์๋ ๋ ธ๋
- ์์/๋ถ๋ชจ: ๊ณ์ธต์ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋
- Leaf: ์์์ด ์๋ ๋ ธ๋.
- ์์ง: ๋ถ๋ชจ ๋ ธ๋์ ์์ ๋ ธ๋ ์ฌ์ด์ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ
- ์ฝํ ์์๋ ์ด์ง ํธ๋ฆฌ๋ง ์๋ฉด ๋๋ค.
- ์ด์งํธ๋ฆฌ๋ ๋ชจ๋ ๋ ธ๋์ ์ต๋ ์ฐจ์๊ฐ 2๋ฅผ ๋์ง ์๋ ํธ๋ฆฌ
- ์ด์ง ํธ๋ฆฌ๋ ๋ฐฐ์ด์ด๋ ํฌ์ธํฐ๋ก ๊ตฌํํ๋ค.
์ด์ง ํธ๋ฆฌ
๋ฐฐ์ด๋ก ํํ
- ๋ฃจํธ ๋ ธ๋๊ฐ ์ธ๋ฑ์ค 1์ ์์ ๊ฒฝ์ฐ
- ์ผ์ชฝ ์์ = ๋ถ๋ชจ์ธ๋ฑ์ค * 2
- ์ค๋ฅธ์ชฝ ์์ = ๋ถ๋ชจ์ธ๋ฑ์ค * 2 + 1
- ๋ฃจํธ ๋ ธ๋๊ฐ ์ธ๋ฑ์ค 0์ ์์ ๊ฒฝ์ฐ
- ์ผ์ชฝ ์์ = ๋ถ๋ชจ์ธ๋ฑ์ค * 2 + 1
- ์ค๋ฅธ์ชฝ ์์ = ๋ถ๋ชจ์ธ๋ฑ์ค * 2 + 2
๋จ์ : ์ด ํํ์ ๋ฐฐ์ด์ ๋น ๊ณต๊ฐ์ ํ๋ณดํด์ผ ํ๋ฏ๋ก ๋ ธ๋๊ฐ ํฌ๋ฐํ ๊ฒฝ์ฐ ๊ณต๊ฐ์ ๋ญ๋นํ ์ ์๋ค.
์๊ฐ ๋ณต์ก๋: ์ด์ง ํธ๋ฆฌ ๋ ธ๋๊ฐ N๊ฐ ์ผ๋, ๋ฐฐ์ด๋ก ์ด์ง ํธ๋ฆฌ ์์ฑํ๋ฉด O(N)์ด ๊ฑธ๋ฆฐ๋ค.
์ด์ง ํธ๋ฆฌ ์ํ
- ์ ์ ์ํ: ํ์ฌ ๋ ธ๋๋ฅผ ๋ถ๋ชจ ๋ ธ๋๋ก ์๊ฐํ์ ๋ ๋ถ๋ชจ ๋ ธ๋ -> ์ผ์ชฝ ์์ ๋ ธ๋ -> ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ ์์๋ก ๋ฐฉ๋ฌธ
- ์ค์ ์ํ: ํ์ฌ ๋ ธ๋๋ฅผ ๋ถ๋ชจ ๋ ธ๋๋ก ์๊ฐํ์ ๋ ์ผ์ชฝ ์์ ๋ ธ๋ -> ๋ถ๋ชจ ๋ ธ๋ -> ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ ์์๋ก ๋ฐฉ๋ฌธ
- ํ์ ์ํ: ํ์ฌ ๋ ธ๋๋ฅผ ๋ถ๋ชจ ๋ ธ๋๋ก ์๊ฐํ์ ๋ ์ผ์ชฝ ์์ ๋ ธ๋ -> ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ -> ๋ถ๋ชจ ๋ ธ๋ ์์๋ก ๋ฐฉ๋ฌธ
๊ฐ์ฅ ์ค์ํ๊ฑด ํ์ฌ ๋ ธ๋๋ฅผ ๋ถ๋ชจ ๋ ธ๋๋ก ์๊ฐํ๋ ๊ฒ
ํฌ์ธํฐ๋ก ํํ
- ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ํธ๋ฆฌ ๊ตฌ์กฐ๋ ๋ฐฐ์ด๋ก ๊ตฌํํ ๊ฒ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ๋ค. ๋ฐฐ์ด์ ํธ๋ฆฌ์ ๋ชจ๋ ์๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ฐจ์งํ๊ฒ ๋์ง๋ง, ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ํ ๋ ธ๋๋ง ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๊ธฐ ๋๋ฌธ
- ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ์ ์์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ณ ํ์ํ ๋๋ง๋ค ํด๋น ๋ ธ๋์ ์์์ ๋ฐ๋ผ๊ฐ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผ
์ด์ง ํ์ ํธ๋ฆฌ ๊ตฌ์ถ ๋ฐฉ๋ฒ
- ์ด์ง ํ์ ํธ๋ฆฌ๋ ๊ฐ ๋ ธ๋๊ฐ ์ผ์ชฝ ์์์ ๋ถ๋ชจ๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง๊ณ , ์ค๋ฅธ์ชฝ ์์์ ๋ถ๋ชจ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ ๊ตฌ์กฐ
- ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋๋ฉด์ ๋์์ ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋ค.
์ด์ง ํ์ ํธ๋ฆฌ ํ์ ๋ฐฉ๋ฒ
- ํ์ฌ ๋ ธ๋์ ๊ฐ์ด ์ฐพ๋ ๊ฐ๊ณผ ๊ฐ์ผ๋ฉด ํ์ ์ข ๋ฃ: ๊ทธ ๊ฐ์ ์ฐพ์ ๊ฒ์ด๋ฏ๋ก ํด๋น ๋ ธ๋์์ ํ์์ ๋๋ธ๋ค.
- ํ์ฌ ๋ ธ๋์ ๊ฐ์ด ์ฐพ๋ ๊ฐ๋ณด๋ค ์๋ค๋ฉด: ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๋ฅผ ํ์
- ํ์ฌ ๋ ธ๋์ ๊ฐ์ด ์ฐพ๋ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด: ์ผ์ชฝ ์์ ๋ ธ๋๋ฅผ ํ์
- ๋ ธ๋๊ฐ ์์ ๋๊น์ง ํ์์ ๊ณ์ํ๋ค๊ฐ ๊ฐ์ด ์์ผ๋ฉด: ํธ๋ฆฌ์ ๊ทธ ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ด์ง ํ์ ํธ๋ฆฌ์ ์๊ฐ ๋ณต์ก๋
- ๊ท ํ์ด ๋ง๋ ๊ฒฝ์ฐ: ํธ๋ฆฌ์ ๊น์ด๊ฐ ๋ก๊ทธ ํํ๋ก ๊ฐ์ํ๋ฏ๋ก O(log N)์ ์๊ฐ ๋ณต์ก๋
- ํธ๋ฆฌ๊ฐ ๊ท ํ ์กํ ์๋ค๋ ๊ฒ์ ์ข์ฐ์ ์์ ๋ ธ๋๊ฐ ๋น์ทํ ์์ ํ์ ๋ ธ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ
- ๊ท ํ์ด ๋ง์ง ์๋ ๊ฒฝ์ฐ: ํธ๋ฆฌ์ ํ์ชฝ์ผ๋ก๋ง ๋ฐ์ดํฐ๊ฐ ๊ณ์ ์์ด๋ ๊ฒฝ์ฐ์๋, ์ต์
์ ๊ฒฝ์ฐ ํธ๋ฆฌ๋ ํ๋์ ์ ํ ๊ตฌ์กฐ์ฒ๋ผ ๋ณํ ์ ์๋ค.
- ์ด๋๋ ํ์์ ์๊ฐ ๋ณต์ก๋๊ฐ O(N) -> ๋ฐฐ์ด ํ์๊ณผ ๋น์ทํ ์ฑ๋ฅ
๊ท ํ ๋ง์ถ๊ธฐ
- ์ด์ง ํ์ ํธ๋ฆฌ์ ์ฅ์ ์ ๊ฐ์ด ๊ณ์ ์ ๋ ฌ๋ ์ํ๋ก ์ ์ง๋๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ฒ ๊ฐ์ ์ฐพ์ ์ ์๋ค๋ ์
- ๊ท ํ ์ด์งํ์ ํธ๋ฆฌ ๊ตฌํ์ ๋์ด๋๊ฐ ๋์์ ์ฝ๋ฉํ ์คํธ์๋ ์ ๋์ค์ง ์๋๋ค
- ex)AVL ํธ๋ฆฌ, ๋ ๋-๋ธ๋ ํธ๋ฆฌ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ
๋ฌธ์
https://github.com/dremdeveloper/codingtest_python/blob/main/solution/26.py
์์ ๋์งํ
https://school.programmers.co.kr/learn/courses/30/lessons/12985
'''
n๋ช
์ ์ฌ๋์ด ๊ฒฝ์ํด์, a์ b๊ฐ ์ธ์ ๋ง๋ถ๋์ง
a,b๋ ํญ์ ์ด๊ธฐ๊ณ
a,b๊ฐ ์ง์๋ฉด a๋ a-1๊ณผ ๋ถ๊ณ , b๋ b-1๊ณผ ๋ถ๊ณ a,b= a//2
a,b๊ฐ ํ์๋ฉด a๋ a+1๊ณผ ๋ถ๊ณ , b๋ b+1๊ณผ ๋ถ๊ณ a,b= a//2+1
a,b๊ฐ 1,2๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณตํ๊ณ ๊ทธ ๋ฐ๋ณตํ ํ์๋ฅผ returnํ๋ฉด ๋จ
a -> 4 -> 2 ->1
b -> 7 -> 4 -> 2
'''
def odd_even(n):
if n%2==0:
return n//2
else:
return (n//2)+1
def solution(n,a,b):
cnt = 1
while not(b==a+1 and a%2==1):
a = odd_even(a)
b = odd_even(b)
cnt+=1
return cnt
print(solution(8,4,7))
print(solution(1048576,12345,12346))
#๊ฒฐ๊ณผ 3
์๊ฐ์ด๊ณผ๊ฐ ๋๋ค -> a,b์ ๋์๋น๊ต์ ์๊ฐ์ ์ฐ๊ธฐ ๋๋ฌธ
def odd_even(n):
if n%2==0:
return n//2
else:
return (n//2)+1
def solution(n,a,b):
cnt = 1
while not(b==a+1 and a%2==1):
if a > b:
a, b = b, a
a = odd_even(a)
b = odd_even(b)
cnt+=1
return cnt
์ด๋ฐ ๊ฒฝ์ฐ๋ ์ฒ์์ด๋ค. ํ ์คํธ ์ผ์ด์ค 34๊ฐ์ค ํ๊ฐ์์ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค...
def odd_even(n):
if n%2==0:
return n//2
else:
return (n//2)+1
def solution(n,a,b):
cnt = 0
while a != b:
if a > b:
a, b = b, a
a = odd_even(a)
b = odd_even(b)
cnt+=1
return cnt
while๋ฌธ ์กฐ๊ฑด์ ๋ฐ๊ฟจ๋ค.
๊ฐ๋จํ๊ฒ ์๊ฐํ๋ฉด ์๋์ฒ๋ผ ํ๋ฉด ๋๋ค. a,b ๊ฐ์ด 1~8์ผ๋ ์์ผ๋ก ์จ๊ฐ๋ฉด์ ๋น๊ตํด๋ณด๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
def solution(n,a,b):
cnt=0
while a != b:
a = (a+1)//2
b = (b+1)//2
cnt+=1
return cnt
๋ค๋จ๊ณ ์นซ์ ํ๋งค
https://school.programmers.co.kr/learn/courses/30/lessons/77486
def solution(enroll, referral, seller, amount):
# dic = {}
# for i in range(len(enroll)):
# dic[enroll[i]] = referral[i]
dic = dict(zip(enroll, referral))
total = {}
for i in range(len(enroll)):
total[enroll[i]] = 0
for i in range(len(amount)):
cur = seller[i]
money = amount[i] *100
while money>0 and cur != '-':
total[cur] += money - money//10
money = money//10
cur = dic[cur]
arr=[]
for k,v in total.items():
arr.append(v)
return arr
print(solution(["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"],
["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"],
["young", "john", "tod", "emily", "mary"], [12, 4, 2, 5, 10]))
- ์ต์ ์๊ฐ, ์ต์ ๊ฒฝ๋ก -> ๋๋น์ฐ์ ํ์, ๋ค์ต์คํธ๋ผ
- ์ด๋, ๊ฐ์ค์น๊ฐ ์๋ค๋ฉด -> ๋๋น์ฐ์ ํ์
'๐ฏ ์๊ณ ๋ฆฌ์ฆ > ์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์งํฉ (1) | 2024.10.04 |
---|---|
ํด์ (3) | 2024.10.03 |
ํ (1) | 2024.10.03 |
์คํ (0) | 2024.09.10 |
๋ฐฐ์ด (1) | 2024.09.09 |