์๋ฃ๊ตฌ์กฐ์ ํ์์ฑ
์ํฉ์ ์๋ง์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํ๋ฉด, ์๊ฐ ๋จ์ถ์ ์ด์ ์ ์ป์ ์ ์์
์๊ณ ๋ฆฌ์ฆ
์๋ฃ๊ตฌ์กฐ์ ์ฐ์ฐ์ ์๋ง๊ฒ ์ ํํ๋ ๊ฒ
0) ์๊ณ ๋ฆฌ์ฆ ๋ณต์ก๋
์๊ฐ, ๊ณต๊ฐ ์์์ ์ผ๋ง๋ ํ์๋ก ํ๋์ง์ ๋ํด ํํํ๋ ๊ฒ
- ์ ํ ์๊ฐ ๋ณต์ก๋ O(${n}$)
- ๋ก๊ทธ ์๊ฐ ๋ณต์ก๋ O(${log n}$)
ex) ์ ๋ ฌ๋ ์๋ชฉ๋ก์์ ํน์ ๊ฐ์ ์ฐพ๊ธฐ ์ํด ์ด์งํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ
- ์ด์ฐจ ์๊ฐ ๋ณต์ก๋ O(${n^2}$)
ex) ์ฝ์ ์ ๋ ฌ
cf) ๊ฐ์ฅ ์ ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ : ๋ณํฉ์ ๋ ฌ (divide and conquer)
๋๋ ๋ O(${log_n}$) * ํฉ์น ๋ O(${n}$)
ex) ๋ฐฐ๋ญ๋ฌธ์
1) ์ ํ๋ฐฐ์ด (List)
์ฐ์ฐ
- ์์ ์ถ๊ฐ
L.append(value)
- ์์ ์ญ์
del(L[index])
L.pop(index)
- ์์ ์ฝ์
L.insert(index, value)
- ์ ๋ ฌ
sorted(L) : ์ ๋ ฌ๋ ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ฐํ
L.sort() : ํด๋น ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌ
cf) ํจ์์ ๋งค๊ฐ๋ณ์
- reverse=True : ์ญ์์ผ๋ก ์ ๋ ฌํ ์ ์๊ฒ ํ๋ ์ต์
- key=์กฐ๊ฑด : ์กฐ๊ฑด์์ ๊ธฐ์ค์ผ๋ก ํด๋น ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌ
cf) ์กฐ๊ฑด์๋ ์ฃผ๋ก lambda ํจ์๋ฅผ ์ด์ฉํ๋ค.
ex1) ์์์ ๊ธธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ lambda x:len(x)
ex2) ๋์ ๋๋ฆฌ์ key ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ lambda x:x["index0"] : key๊ฐ index0์ธ ๋์ ๋๋ฆฌ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
์ฃผ์ด์ง ๋ฆฌ์คํธ
[{”index0” : 3, “index1” : 2}, {”index0” : 0, “index1”: 4}]
๊ฒฐ๊ณผ ๋ฆฌ์คํธ
[{”index0” : 0, “index1”: 4}, {”index0” : 3, “index1” : 2}]
ํ์ ์๊ณ ๋ฆฌ์ฆ
- ์ ํ ํ์ O(${n}$)
๋ฆฌ์คํธ ์์์๋ถํฐ ์์ฐจ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ด์ง ํ์ O(${log n}$)
ํ์ํ๋ ค๋ ๋ฆฌ์คํธ๊ฐ ์ ๋ ฌ๋์ด ์๋ค๋ ์ ์ ๋ฅผ ๊ฐ์ง๊ณ ๊ฐ์ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
ํ ๋ฒ ์ฐ์ฐ์ด ์ด๋ค์ง ๋๋ง๋ค ํ์ํด์ผ ํ๋ ๋ฆฌ์คํธ์ ๋ฒ์๊ฐ ๋ฐ์ผ๋ก ์ค์ด๋ค๊ฒ ๋จ
๋ฉ์ธ ๋ก์ง
lower : ๋งจ ์์ ์ธ๋ฑ์ค(์ ์ผ ์์ ๊ฐ์ ์ธ๋ฑ์ค)
upper : ๋งจ ๋ค์ ์ธ๋ฑ์ค(์ ์ผ ํฐ ๊ฐ์ ์ธ๋ฑ์ค)
middle : (lower+upper)//2
-
- middle ์ธ๋ฑ์ค์ ๊ฐ์ด ํ์ํ๋ ค๋ ๊ฐ๋ณด๋ค ์์ผ๋ฉด lower=middle+1
- ํ์ํ๋ ค๋ ๊ฐ๋ณด๋ค ํฌ๋ฉด upper=middle-1
- ํ์ํ๋ ค๋ ๊ฐ๊ณผ ๊ฐ์ผ๋ฉด middle ๋ฐํ
1) ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ํ์ด
def solution(L, x, l, u):
if l>u:
return -1
mid = (l + u) // 2
if x == L[mid]:
return mid
elif x < L[mid]:
return solution(L, x, l, mid-1)
else:
return solution(L, x, mid+1, u)
2) ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ ํ์ด
def solution(L, x):
answer=-1
lower=0
upper=len(L)-1
while lower<=upper:
middle=(lower+upper)//2
if L[middle]==x:
answer=middle
break
elif L[middle]<x:
lower=middle+1
else:
upper=middle-1
return answer
2) ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ
ํ๋์ ํจ์์์ ์๊ธฐ ์์ ์ ํธ์ถํ์ฌ ์์ ์ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ.
๋๋ถ๋ถ ๋ฐ๋ณต๋ฌธ์ ์ํํ๋ ์ฐ์ฐ๋ณด๋ค ํจ์จ์ฑ์ด ๋ฎ์ผ๋, ์ฌ๋์ ์ฌ๊ณ ๋ฐฉ์ ๊ทธ๋๋ก ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ
์ข ๊ฒฐ์กฐ๊ฑด์ด ํ์ํจ์ ์ฃผ์ํ์!
๋ํ์ ์ธ ๋ฌธ์
๐์ด์งํธ๋ฆฌ
- ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ ํญ์ root๋ณด๋ค ํด ๊ฒ
- ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ ํญ์ root๋ณด๋ค ์์ ๊ฒ
๐ ์์ฐ์์ ํฉ
- ์์ฐ์์ ํฉ ๊ตฌํ๋ ๋ฌธ์
๐ฆ ์กฐํฉ์ ์(Combination)
N๊ฐ์ ์๋ก ๋ค๋ฅธ ์์์์ M๊ฐ๋ฅผ ๋ฝ๋ ๊ฒ
์กฐํฉ์ ์ ${\frac{N!}{M!(N-M)!}}$ ๋ ๋ค์๊ณผ ๊ฐ์ ๋๊ฐ์ง ๊ฒฝ์ฐ๋ก ์ชผ๊ฐ์ด ์๊ฐํ ์ ์๋ค.
- ํน์ ์์๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ
- ํน์ ์์๋ฅผ ํฌํจํ์ง ์๋ ๊ฒฝ์ฐ
์ด๋ฅผ ์ด์ฉํ์ฌ ์กฐํฉ์ ์ฌ๊ท์ ์ผ๋ก ๊ณ์ฐํ ์ ์๋ค.
combi(n, m) = combi(n-1, m-1)+combi(n-1, m)
${\frac{N!}{M!(N-M)!}}$ = ${\frac{(N-1)!}{(M-1)!(N-M)!}}$ + ${\frac{(N-1)!}{M!(N-1-M)!}}$
๐๏ธ ํ๋ ธ์ด์ ํ
์ธ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํ์ ๊ฝ์ ๋, ํฐ ์ํ์ด ์์ ์ํ ์์ ์นํ์ง ์๊ณ ์ต์๋ก ์ํ์ ์ฎ๊ธฐ๋ ๊ฒฝ์ฐ์ ์
1) ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ํ์ด
def Hanoi(n, start, end):
temp=6-start-end
if n==1:
return [[start, end]]
else:
return Hanoi(n-1, start, temp)+[[start, end]]+Hanoi(n-1, temp, end)
def solution(n):
return Hanoi(n, 1, 3)
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๐ง๐ฆฐ ํผ๋ณด๋์น์์ด
F(0) = 0, F(1)=1 ์ผ ๋, F(n)=F(n-1)+F(n-2)์ธ ์์ด
1) ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ํ์ด
def fibonacci(x):
if x==0:
return 0
if x==1:
return 1
return fibonacci(x-1)+fibonacci(x-2)
def solution(x):
return fibonacci(x)
2) ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ ํ์ด
def solution(x):
last_2=0
last_1=1
if x==0:
return 0
answer=0
for i in range(2, x+1):
answer=last_2+last_1
last_2, last_1=last_1,answer
return answer
๊ด๋ จ ๋ฌธ์
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr