๋ฐ๋ธŒ์ฝ”์Šค_๋ฐ์ดํ„ฐ์—”์ง€๋‹ˆ์–ด๋ง

[Week2 ์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜] TIL 1์ผ์ฐจ - ๋ฆฌ์ŠคํŠธ

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2023. 10. 16. 17:06
728x90

์ž๋ฃŒ๊ตฌ์กฐ์˜ ํ•„์š”์„ฑ

์ƒํ™ฉ์— ์•Œ๋งž์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜๋ฉด, ์‹œ๊ฐ„ ๋‹จ์ถ•์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ

์•Œ๊ณ ๋ฆฌ์ฆ˜

์ž๋ฃŒ๊ตฌ์กฐ์™€ ์—ฐ์‚ฐ์„ ์•Œ๋งž๊ฒŒ ์„ ํƒํ•˜๋Š” ๊ฒƒ

 

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

 

728x90