Coder Social home page Coder Social logo

algorithm_study's Introduction

๐Ÿ–ฅ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ถ€ํ•˜๋Š” ๊ณต๊ฐ„ โœ๏ธ

๊ณ ์ „์ด ๊ณ ์ „์ธ ์ด์œ ๋Š”, ๊ฒฐ์ฝ” ์ง„๋ฆฌ์— ๊ฐ€๊น๋„๋ก ๋ถˆ๋ณ€ํ•จ์ด ์ˆ˜๋งŽ์€ ๋ฐ˜๋ก€์— ์˜ํ•ด ๋ฌด๋„ˆ์ง€์ง€ ์•Š์•˜์Œ์ด๋‹ค.

๊ธฐ๋ณธ๋ถ€ํ„ฐ ์ถฉ์‹คํ•˜๊ฒŒ, ์šฐ์งํ•˜๊ฒŒ, ํ•œ ๊ฑธ์Œ์”ฉ ๋‚ด๋”›์–ด ๋ณธ๋‹ค๐Ÿฎ




๐Ÿ“๊ณต๋ถ€ํ•œ ๊ฒƒ


Greedy(ํƒ์š•๋ฒ•)

Binary Search(์ด์ง„ ํƒ์ƒ‰)

BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)

DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

DP(๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)

Dijkstra(๋‹ค์ต์ŠคํŠธ๋ผ)

Floyd-Warchall(ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ)




Greedy

๊ทธ๋ฆฌ๋””๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํƒ์š•๋ฒ•์ด๋‹ค. ๊ฐ€์žฅ ์ตœ๋Œ€์˜ ๊ฐ€์น˜๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•ด๊ฐ€๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ. ์ด๋ ‡๋‹คํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋”ฐ๋กœ ์—†๋‹ค.


๐ŸŽˆ์ฃผ์˜ํ•  ์ : ๊ฐ€์žฅ ์ตœ๋Œ€์˜ ๊ฐ€์น˜๋ฅผ ํš๋“ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์ ์—์„œ ์‰ฝ์ง€๋งŒ, ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋งˆ์ง€๋ง‰ ์„ ํƒ์—์„œ์˜ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ด€๊ฑด์ด ๋  ์ˆ˜ ์žˆ๋‹ค.





Binary_Search

์ด์ง„ํƒ์ƒ‰ ๋˜๋Š” ์ด๋ถ„ํƒ์ƒ‰์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ „์ฒด์˜ ์š”์†Œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜์”ฉ ์ค„์—ฌ๋‚˜๊ฐ€๋ฉฐ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์•„๋‚˜๊ฐ€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ํŠนํžˆ ๋ฌธ์ œ ์ƒ์—์„œ 100,000,000๊ฐœ ์ด์ƒ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค, ์ฆ‰ ํƒ์ƒ‰ ์ผ€์ด์Šค๊ฐ€ ์ฃผ์–ด์งˆ ๊ฒฝ์šฐ๋Š” ๋Œ€์ฒด๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ์— ๊ฑธ๋ฆฌ๋ฏ€๋กœ ๊นŠ์ด๊ฐ€ 31๊นŒ์ง€ ์ค„์–ด๋“œ๋Š” ํšจ๊ณผ์ ์ธ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜


def binary_search(k, start, end):
    # ์ด ๋•Œ k๋Š” ํƒ์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด๋‹ค.
    # ์ด์ƒํ•œ ์ด๋ถ„ํƒ์ƒ‰ ์‚ฌ์šฉํ•˜์ง€๋ง๊ณ  ์ •์„์— ๋”ฐ๋ฅด์ž.
    while start <= end:
        mid = (start + end) // 2
        if k == m_list[mid]:
            result.append(k)
            return
        elif k > m_list[mid]:
            start = mid+1
        else:
            end = mid-1
ํƒ์ƒ‰ํ•  ๋Œ€์ƒ์˜ ์ฒ˜์Œ๊ณผ ๋์„ ์ •ํ•ด๋‘๊ณ  while๋ฌธ์„ ํ†ตํ•ด ๋‘๊ฐœ๊ฐ€ ์ผ์น˜ํ•˜๊ฑฐ๋‚˜, ๊ต์ฐจํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜์”ฉ ์ค„์—ฌ๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
[๋ฐฑ์ค€ 2110๋ฒˆ: ๊ณต์œ ๊ธฐ ์„ค์น˜]:(https://www.acmicpc.net/problem/2110)
์œ„ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์ด์ง„ ํƒ์ƒ‰์ด ๊ฐ€์žฅ ์ด์ƒ์ ์ด๊ณ ๋„, ์‹ค์šฉ์ , ๊ทธ๋ ‡์ง€๋งŒ ์ด์ง„ํƒ์ƒ‰์„ ์ ‘๊ทผ๋ฒ•์œผ๋กœ ๋– ์˜ฌ๋ฆฌ๊ธฐ ๊ฐ€์žฅ ์‰ฝ์ง€ ์•Š์•˜๋˜ ํ˜•ํƒœ์ด๋‹ค.
๋‹ค์–‘ํ•œ ๊ฒฝํ—˜์„ ํ†ตํ•ด ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ ‘ํ•ด๋ณด์ž.
๐ŸŽˆ์•ž์„œ ๋งํ–ˆ๋“ฏ ์™„๋ฒฝํ•˜๋‹ค ๋Š๋ผ๊ธฐ ์ „๊นŒ์ง„ ์ด์ƒํ•œ ํ’€์ด ๋ณด๊ณ  ํ˜นํ•˜์ง€ ๋ง๊ณ  ์ •์„๋Œ€๋กœ ํ•˜์ž.





BFS

BFS(๋„ˆ๋น„์šฐ์„  ํƒ์ƒ‰)๋Š” DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)์™€ ์ง์„ ์ด๋ฃฌ๋‹ค. ํ˜„์žฌ๊นŒ์ง€ ํŒŒ์•…ํ•œ ๋ฐ”๋กœ๋Š” ํ–‰๋ ฌ์—์„œ ์ „์—ผ์„ฑ์ด ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€์— ์˜ํ•œ ๋‹จ๊ณ„๋ณ„ ํŒ๋‹จ์„ ์ด๋ฃจ์–ด์•ผ ํ•  ๊ฒฝ์šฐ ์“ฐ์ž„.


def bfs():
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or ny < 0 or nx >= n or ny >= m:
                continue
            if graph[nx][ny] == -1:
                continue
            if graph[nx][ny] == 0 or graph[nx][ny] > (graph[x][y] + 1):
                graph[nx][ny] = graph[x][y] + 1
                queue.append((nx, ny))
์ด์ฒ˜๋Ÿผ ์ฃผ๋กœ ํ–‰๋ ฌ์„ ํƒ์ƒ‰ํ•˜๋Š” ๊ณผ์ •์—์„œ
while, queue ๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹.
์‹œ์ž‘์ ์„ ์ œ์ผ ๋จผ์ € ํ์— ์‚ฝ์ž… ํ›„, ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•œ๋‹ค๋ฉด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ์— ์‚ฝ์ž…
๐ŸŽˆDFS์™€์˜ ์ฐจ์ด์ : dfs๋Š” ์Šคํƒ์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜, ์œ„์™€ ๊ฐ™์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ ๋…ธ๋“œ์—์„œ ์žฌ๊ท€์‹์œผ๋กœ ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๋Š” ๋ฐ์— ๋ฐ˜ํ•ด, bfs๋Š” ํ์— ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.





DFS

DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰) ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์€ ํ›„์— ๋“ฑ์žฅํ•˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ์–ด๋Š์ •๋„ ๊ถค๋ฅผ ๊ฐ™์ดํ•œ๋‹ค. ์ฐจ์ด์ ์€ ๋น„์šฉ์ด ๋”ฐ๋กœ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด์„œ, ๋ฐฉ๋ฌธ ๋…ธ๋“œ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๋•Œ ์“ฐ์ธ ๋‹ค๋Š” ์ ์ด๋‹ค.


def dfs(graph, v, visited):
    visited[v] = True
    print(v, end=' ')
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)
์œ„์˜ ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ DFS์˜ ํ•ต์‹ฌ ์ฝ”๋“œ๋Š” BFS์— ๋น„ํ•ด ๊ตฌํ˜„์ด ์‰ฌ์šด ํŽธ์ด๋‹ค.
BFS์—์„œ ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ DFS๋Š” ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ธ๋ฐ,
๋ณดํ†ต์˜ ๊ฒฝ์šฐ์—์„œ๋Š” ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์œ„์™€ ๊ฐ™์ด ์žฌ๊ท€์  ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰์„ ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ๊ณผ์ ์ด๋‹ค.
import sys
sys.setrecursionlimit(100000)
๐ŸŽˆํŠนํžˆ ํŒŒ์ด์ฌ์—์„œ ์žฌ๊ท€์˜ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์งˆ ๊ฒฝ์šฐ recursion error๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ
์ด๋•Œ๋Š” ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด recursion limit์„ ๋Š˜๋ ค์ฃผ๋Š” ๊ฒƒ์ด ํ•ด๊ฒฐ์ฑ…์ด๋‹ค.





DP

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ๋งˆ์ฃผ์ณค์„ ๋•Œ, ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ถ„ํ• ์ •๋ณต์„ ํ–‡๊ฐˆ๋ฆฌ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๋ฌธ์ œ๋“ค์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ์žˆ๋‹ค(ex. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด)
  • ๋ถ„ํ• ์ •๋ณต - ๋ฌธ์ œ๊ฐ€ ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋‰˜์–ด ์งˆ ๋ฟ ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค(ex. ํ€ต ์ •๋ ฌ)

๐Ÿ’ก๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋‘ ์ข…๋ฅ˜


  • Top-Down(์ฃผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜)
d = [0]*100

# ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜(Fibonacci Function)๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„(ํƒ‘๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ)
def fibo(x):
    # ์ข…๋ฃŒ์กฐ๊ฑด(1 ํ˜น์€ 2์ผ ๋•Œ 1์„ ๋ฐ˜ํ™˜)
    if x == 1 or x == 2:
        return 1
    # ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์  ์žˆ๋Š” ๋ฌธ์ œ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
    if d[x] != 0:
        return d[x]
    # ์•„์ง ๊ณ„์‚ฐํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ผ๋ฉด ์ ํ™”์‹์— ๋”ฐ๋ผ์„œ ํ”ผ๋ณด๋‚˜์น˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    d[x] = fibo(x-1) + fibo(x-2)
    return d[x]
  • Bottom-Up(์ฃผ๋กœ ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ)
d = [0]*100

# ์ฒซ ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์™€ ๋‘ ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 1
d[1] = 1
d[2] = 1
n = 99

for i in range(3, n+1):
    d[i] = d[i-1] + d[i-2]

print(d[n])
๐Ÿ“Œ๊ฐ€๋Šฅํ•œ Bottom-Up ๋ฐฉ์‹์„ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.




Dijkstra

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ํšจ๊ณผ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ถœ๋ฐœ์ ๊ณผ ๋์ ์ด ์žˆ๋‹ค๋Š” ๋ฐ์—์„œ ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ๊ณผ ์ฐจ์ด์ ์ด ์žˆ๋‹ค. ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ๊ณผ์€ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ์†Œ๋น„์šฉ์„ ๊ตฌํ•จ. ๋ฌธ์ œ ์ค‘ ์–ธ๋œป ๋ณด๋ฉด BFS, DFS๋กœ ํ’€์–ด์•ผํ•  ๊ฒƒ ๊ฐ™์€ ๊ฒฝ์šฐ๋“ค์ด ์žˆ๋Š”๋ฐ ํ–‡๊ฐˆ๋ฆฌ์ง€ ๋ง์ž!


์ถœ๋ฐœ ๋…ธ๋“œ์™€ ํƒ์ƒ‰ํ•˜๋Š” ๋…ธ๋“œ์—์„œ ์ตœ์†Œ๊ฑฐ๋ฆฌ(๋น„์šฉ)์„ ๊ฐ–๋Š” ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์—์„œ ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)
์ฆ‰, ํž™(Heap) ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ํž™์€ ์ตœ์†Œ ํž™(Minimum Heap)์ด๋‹ค.
๐Ÿ”ฝ ์•„๋ž˜๋Š” ํž™์„ ์ด์šฉํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌํ˜„๋ถ€
def dijkstra(start):
    q = []
    # ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ํ์— ์‚ฝ์ž…
    heapq.heappush(q, (0, start))
    distance[start] = 0
    while q: # ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
        # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
        dist, now = heapq.heappop(q)
        # ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
        if distance[now] < dist:
            continue
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
        for i in graph[now]:
            cost = dist + i[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))
์ด ๋•Œ Python์˜ ํž™ ๊ตฌ์กฐ์— ์ €์žฅ๋˜๋Š” ๋น„์šฉ-๋…ธ๋“œ๋ฒˆํ˜ธ์™€ ํ†ต์ƒ ๋ฌธ์ œ์—์„œ ์ œ์‹œ๋˜๋Š” ๋…ธ๋“œ๋ฒˆํ˜ธ-๋น„์šฉ ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•˜์ง€ ์•Š์Œ์œผ๋กœ ํ–‡๊ฐˆ๋ฆฌ์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(ElogV)(์ด ๋•Œ, E๋Š” ๊ฐ„์„ ์˜ ์ˆ˜, V๋Š” ๋…ธ๋“œ์˜ ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.)
ํ•ด๋‹น ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
์ „์ฒด ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฒฐ๊ตญ E๊ฐœ์˜ ์›์†Œ๋ฅผ ํž™์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๋ชจ๋‘ ๋นผ๋‚ด๋Š” ์—ฐ์‚ฐ๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ ๋จผ์ € O(ElogE)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.
์ด๋•Œ, ์ค‘๋ณต ๊ฐ„์„ ์ด ์—†๋‹ค๋Š” ์ „์ œ ํ•˜์— E๋Š” ํ•ญ์ƒ V^2 ์ดํ•˜์ด๋‹ค.(๋ชจ๋“  ๋…ธ๋“œ๋ผ๋ฆฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ ๊ฐ„์„ ์˜ ์ˆ˜๋Š” ์‹œ๊ฐ„๋ณต์žก๋„ ์ƒ V^2โžก๏ธnP2 ์ˆœ์—ด์˜ ๋งค์ปค๋‹ˆ์ฆ˜)
๋‹ค์‹œ๋งํ•ด logE๋Š” logV^2๋ณด๋‹ค ์ž‘๋‹ค. O(logV^2)๋Š” O(2logV)์ด๊ณ , ์ด๋Š” O(logV)์ด๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(ElogV)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.





Floyd-Warchall

ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ, ์•„์˜ˆ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ–๋Š”๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด, ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ์€ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋น„์šฉ ์‚ฐ์ถœ์„ ํ•œ๋‹ค๋Š” ์ ์—์„œ ๋‹ค๋ฅด๋‹ค.


# ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
for k in range(1, n+1): # n๊ฐœ์˜ ๊ฐ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜๋Š” ๋ชจ๋“  a-b์…‹์˜ n-1P2์˜ ์ˆœ์—ด์— ๋Œ€ํ•œ O(n^2)์˜ ์—ฐ์‚ฐ์„ ์ง„ํ–‰
    for a in range(1, n+1):
        for b in range(1, n+1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])
ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ตฌํ˜„์— ์žˆ์–ด์„œ ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ์ฃผ์„์—์„œ ์ฒ˜๋Ÿผ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N^3)์ด๋ฏ€๋กœ
ํ•ด๋‹น ๊ฒฝ์šฐ๊ฐ€ ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ์„ ํ†ตํ•ด ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•œ์ง€์— ๋Œ€ํ•œ ํŒ๋‹จ์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.





algorithm_study's People

Contributors

nyeok98 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.