๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์„ ํ˜•๊ฒ€์ƒ‰, ์ด์ง„๊ฒ€์ƒ‰, ํŠธ๋ฆฌ๊ตฌ์กฐ(BFS, DFS) ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ์ปดํ“จํ„ฐ ๊ตฌ์กฐ/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์„ ํ˜•๊ฒ€์ƒ‰, ์ด์ง„๊ฒ€์ƒ‰, ํŠธ๋ฆฌ๊ตฌ์กฐ(BFS, DFS)

์ง•์ง•์•ŒํŒŒ์นด 2022. 9. 30. 10:59
728x90
๋ฐ˜์‘ํ˜•

220930 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” "๊ฐ€์žฅ ์‰ฌ์šด ๋…ํ•™_์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฒซ๊ฑธ์ŒํŽธ python ํŽธ"์˜ ์„œ์ ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

 

 

 

1๏ธโƒฃ์„ ํ˜•๊ฒ€์ƒ‰

: ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•˜๊ณ  ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์กฐ์‚ฌํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ

: ๊ฐ’์„ ์ฐพ์„ ๋–„๊นŒ์ง€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ์ฒ˜๋ฆฌ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค

 

  • ๋ฐ์ดํ„ฐ ์ˆ˜ n์ด๋ผ ํ•˜๋ฉด ๋น„๊ตํšŸ์ˆ˜์˜ ํ‰๊ท ์€ (n+1) / 2
  • O(n)
# ์„ ํ˜•๊ฒ€์ƒ‰
# ์›ํ•˜๋Š” ๊ฐ’ ์ฐพ๊ธฐ

num_list = [23, 12, 55, 32, 45, 76, 88, 52]

def linear (n) :
    for i in num_list :
        if i == n :
            return True
    return False

print(linear(5))

# result
# False

 

 

2๏ธโƒฃ ์ด์ง„๊ฒ€์ƒ‰

: ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ๋น ๋ฅธ ์†๋„๋กœ ๊ฒ€์ƒ‰์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ

: ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ์•ž์ด๋‚˜ ๋’ค์˜ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณต

: ๋ฆฌ์ŠคํŠธ์˜ ์™ผ์ชฝ ๋๊ณผ ์˜ค๋ฅธ์ชฝ ๋์—์„œ๋ถ€ํ„ฐ ์ฐพ๋Š” ์œ„์น˜๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ขํžˆ๋ฉด์„œ ๊ฒ€์ƒ‰

 

  • ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ–ˆ์„ ๋•Œ ๋น„๊ต ํšŸ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚จ
  • ์ฒ˜๋ฆฌ ์†๋„๋Š” ๋” ๋น ๋ฅด์ง€๋งŒ, ์‚ฌ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ
  • O(logn)
# ์ด์ง„๊ฒ€์ƒ‰
# ๋ฆฌ์ŠคํŠธ์˜ ์™ผ์ชฝ ๋๊ณผ ์˜ค๋ฅธ์ชฝ ๋์—์„œ๋ถ€ํ„ฐ ์ฐพ๋Š” ์œ„์น˜๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ขํžˆ๋ฉด์„œ ๊ฒ€์ƒ‰


data = [10, 15 , 22, 26, 38, 42, 56, 61]
def binary_search (data, value) :
    left = 0
    right = len(data) - 1

    while left <= right :
        mid = (left + right) // 2

        if data[mid] == value :
            return mid
        
        elif data[mid] < value :
            left = mid + 1
        
        else :
            right = mid - 1
    return False

print(binary_search(data, 61))

# result
# 7

 

 

3๏ธโƒฃ ํŠธ๋ฆฌ๊ตฌ์กฐ ํƒ์ƒ‰

: ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰

: ํŠธ๋ฆฌ๊ตฌ์กฐ๋ž€, ์›๊ณผ ์„ ์„ ์‚ฌ์šฉํ•ด ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋ถ„๊ธฐ๋ฅผ ํ‘œํ˜„! ๊ฐ€์ง€๊ฐ€ ๋ฒ‹์–ด์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ผ ๋ถˆ๋ฆผ

: ๊ฐ ์›์„ ๋…ธ๋“œ (node), ์„ ์„ ์—์ง€ (edge)

https://medium.com/quantum-ant/%ED%8A%B8%EB%A6%AC-tree-cec69cfddb14

  • ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ (breadth - first search)
    • ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๋Š” ๊ณณ์—์„œ๋ถ€ํ„ฐ ๊ฐ€๊นŒ์šด ๊ฒƒ์„ ๋‚˜์—ดํ•˜๊ณ  ๊ฐ๊ฐ์„ ์ž์„ธํžˆ ์กฐ์‚ฌํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•
    • ํƒ์ƒ‰ํ•  ์กฐ๊ฑด์— ๋ถ€ํ•ฉ๋˜๋Š” ๊ฒƒ์€ ํ•˜๋‚˜๋งŒ ์–ป์œผ๋ฉด ๋˜๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ๋ฐœ๊ฒฌ๋œ ์‹œ์ ์— ์ฒ˜๋ฆฌ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ์–ด ์ฒ˜๋ฆฌ์†๋„ ๋น ๋ฆ„
# ๋„ˆ๋น„์šฐ์„  ํƒ์ƒ‰
# ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ ๊ฐ๊ฐ์„ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„
# ๋ฆฌ์ŠคํŠธ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ -> ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์œ„์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰ํ•œ ๊ฒƒ์ž„

tree = [[1, 2], [3, 4], [5, 6], [7, 8], [ 9, 10], [11, 12], [13, 14],
[], [], [], [], [], [], [], []]     # ๋นˆ ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ๋…ธ๋“œ์˜ ํƒ์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ์˜์—ญ์„ ํ™•๋ณดํ•˜๋ ค๋Š” ๊ฒƒ

data = [0]

while len(data) > 0 :
    pos = data.pop(0)   # pop : ๋งจ ์•ž์—์„œ ๊บผ๋‚ด๊ธฐ
    print(pos, end = " ")
    for i in tree[pos] :
        data.append(i)  # ๋์— ์ถ”๊ฐ€

# result
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

 

  • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ (depth - first search)
    • ์›ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ๋” ์ง„ํ–‰๋˜์ง€ ์•Š์œผ๋ฉด, ์ด์ „ ์œ„์น˜๋กœ ๋Œ์•„๊ฐ€๋Š” ๋ฐฉ๋ฒ•
    • ๋ฐฑํŠธ๋ž™(backtrack) ์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, ๋ฌธ์ œ์˜ ๋ชจ๋“  ๋‹ต์„ ์ฐพ์„ ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ
    • ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ
    • ๋ชจ๋“  ๋‹ต์„ ์ฐพ์ง€ ์•Š๊ณ  ์ •ํ•ด์ง„ ๊นŠ์ด๊ฐ€์ง€ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋„ ๋งŽ์ด ์‚ฌ์šฉ
      • ์ „์œ„ ์ˆœํšŒ (pre-order traversal)
      • ์ค‘์œ„ ์ˆœ์œ„ (in-order traversal))
      • ํ›„์œ„ ์ˆœ์œ„ (post-order traversal)

https://hanamon.kr/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%83%90%EC%83%89-tree-traversal-%ED%8A%B8%EB%A6%AC-%EC%88%9C%ED%9A%8C/

# ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰
# ์ฃผ๋กœ ์žฌ๊ท€ ์‚ฌ์šฉ

# 1) ์ „์œ„ ์ˆœํšŒ๋ฅผ ์ด์šฉํ•œ ํƒ์ƒ‰
tree = [[1, 2], [3, 4], [5, 6], [7, 8], [ 9, 10], [11, 12], [13, 14],
[], [], [], [], [], [], [], []]     # ๋นˆ ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ๋…ธ๋“œ์˜ ํƒ์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ์˜์—ญ์„ ํ™•๋ณดํ•˜๋ ค๋Š” ๊ฒƒ

def search(pos) :
    print(pos, end = " ")       # ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์ „์— ํ˜„์žฌ ๋…ธ๋“œ ์ถœ๋ ฅ
    for i in tree[pos] :        # ์ž์‹ ๋…ธ๋“œ ํƒ์ƒ‰
        search(i)               # ์žฌ๊ท€ ํƒ์ƒ‰

search(0)

# result
# 0 1 3 7 8 4 9 10 2 5 11 12 6 13 14
# 2) ํ›„์œ„ ์ˆœํšŒ๋ฅผ ์ด์šฉํ•œ ํƒ์ƒ‰
tree = [[1, 2], [3, 4], [5, 6], [7, 8], [ 9, 10], [11, 12], [13, 14],
[], [], [], [], [], [], [], []]     # ๋นˆ ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ๋…ธ๋“œ์˜ ํƒ์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ์˜์—ญ์„ ํ™•๋ณดํ•˜๋ ค๋Š” ๊ฒƒ

def search(pos) :
    for i in tree[pos] :        # ์ž์‹ ๋…ธ๋“œ ํƒ์ƒ‰
        search(i)               # ์žฌ๊ท€ ํƒ์ƒ‰
    print(pos, end = " ")       # ์ž์‹ ๋…ธ๋“œ ํƒ์ƒ‰ ํ›„ ์ถœ๋ ฅ        

search(0)

# result
# 7 8 3 9 10 4 1 11 12 5 13 14 6 2 0
# 3) ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ์ด์šฉํ•œ ํƒ์ƒ‰
tree = [[1, 2], [3, 4], [5, 6], [7, 8], [ 9, 10], [11, 12], [13, 14],
[], [], [], [], [], [], [], []]     # ๋นˆ ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ๋…ธ๋“œ์˜ ํƒ์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ์˜์—ญ์„ ํ™•๋ณดํ•˜๋ ค๋Š” ๊ฒƒ

def search(pos) :
    if len(tree[pos]) == 2 :        # ์ž์‹ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ์žˆ์„ ๋•Œ
        search(tree[pos][0])
        print(pos, end = " ")       # ์™ผ์ชฝ ๋…ธ๋“œ์™€ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ ์‚ฌ์ด์— ์ถœ๋ ฅ
        search(tree[pos][1])
    elif len(tree[pos]) == 1 :      # ์ž์‹ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ ์žˆ์„ ๋•Œ
        search(tree[pos][0])
        print(pos, end = " ")
    else :
        print(pos, end = " ")

search(0)

# result
# 7 3 8 1 9 4 10 0 11 5 12 2 13 6 14
  • ๊ฒฝ๋กœ๊ฐ€ ๋ณต์žกํ•œ ๋ชจ๋“œ ๋…ธ๋“œ ํƒ์ƒ‰ํ•  ๊ฒฝ์šฐ
    • ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ : ํƒ์ƒ‰ ์ค‘์ธ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•จ
    • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ : ํ˜„์žฌ ๊ฒฝ๋กœ์ƒ์˜ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ํƒ์ƒ‰ ์ง„ํ–‰ ๊ฐ€๋Šฅ (๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ค„์ž„)
  • ์ตœ๋‹จ์œผ๋กœ ๋„๋‹ฌํ•  ๊ธธ์„ ํ•˜๋‚˜๋งŒ ํƒ์ƒ‰ํ•  ๊ฒฝ์šฐ
    • ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ : ๋ฐœ๊ฒฌ๋œ ์‹œ์ ์— ์ฒ˜๋ฆฌ ์ข…๋ฃŒํ•จ
    • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ : ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์กฐ์‚ฌํ•œ ๋’ค ์ตœ๋‹จ์ธ์ง€ ์—ฌ๋ถ€ ํŒ์ •

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments