์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค

Greedy

  • ํ˜„์žฌ ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ์ข‹์•„ ๋ณด์ด๋Š” ๊ฒƒ ๋งŒ์„ ์„ ํƒํ•ด๋„ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค
  • ๊ฐ€์žฅ ํฐ ์ˆœ์„œ๋Œ€๋กœ, ๊ฐ€์žฅ ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ์™€ ๊ฐ™์ด ๊ธฐ์ค€์„ ์ œ์‹œํ•ด ์ค€๋‹ค
  • ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ž์ฃผ ์ง์„ ์ด๋ค„ ์ถœ์ œ๋œ๋‹ค

์˜ˆ์ œ

  1. ๊ฑฐ์Šค๋ฆ„๋ˆ

    ๋‹น์‹ ์€ ์Œ์‹์ ์˜ ๊ณ„์‚ฐ์„ ๋„์™€์ฃผ๋Š” ์ ์›์ด๋‹ค. ์นด์šดํ„ฐ์—๋Š” ๊ฑฐ์Šค๋ฆ„๋ˆ์œผ๋กœ ์‚ฌ์šฉํ•  500์›, 100์›, 50์›, 10์› ์งœ๋ฆฌ ๋™์ „์ด ๋ฌดํ•œ์ด ์กด์žฌํ•œ๋‹ค. ์†๋‹˜์—๊ฒŒ ๊ฑฐ์Šฌ๋Ÿฌ ์ค˜์•ผ ํ•  ๋ˆ์ด N์›์ผ ๋•Œ ๊ฑฐ์Šฌ๋Ÿฌ ์ค˜์•ผ ํ•  ๋™์ „์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ. ๋‹จ ๊ฑฐ์Šฌ๋Ÿฌ ์ค˜์•ผ ํ•  ๋ˆ N์€ ํ•ญ์ƒ 10์˜ ๋ฐฐ์ˆ˜์ด๋‹ค.

    ํ•ด์„ค

    • ๊ทธ๋ฆฌ๋””๋ฅผ ์ด์šฉํ•ด ํ’€ ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ๋กœ ๊ฐ„๋‹จํ•œ ์•„์ด๋””์–ด๋งŒ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํฐ ๋ˆ ๋ถ€ํ„ฐ ๋จผ์ € ๊ฑฐ์Šฌ๋Ÿฌ ์ค„ ์ˆ˜ ์žˆ์„ ๋งŒํผ ๊ฑฐ์Šฌ๋Ÿฌ ์ค€๋‹ค.
    • ๋™์ „์„ ์ฐจ๋ก€๋Œ€๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์ค„ ์ˆ˜ ์žˆ์„ ๋งŒํผ ๊ฑฐ์Šฌ๋Ÿฌ ์ฃผ๋ฉด ์ตœ์†Œ์˜ ๋™์ „ ๊ฐœ์ˆ˜๋กœ ๋ชจ๋‘ ๊ฑฐ์Šฌ๋Ÿฌ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์ •๋‹น์„ฑ

  • ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋Š” ๊ทธ๋ฆฌ๋””๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค
  • ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฌธ์ œ์˜ ํ•ด๋ฒ•์„ ์ฐพ์•˜์„ ๋•Œ๋Š” ๊ทธ ํ•ด๋ฒ•์ด ์ •๋‹นํ•œ์ง€ ๊ฒ€ํ† ํ•ด์•ผ ํ•œ๋‹ค
  • ์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” ์ž‘์€ ๋‹จ์œ„์˜ ๋™์ „๋“ค์„ ์ข…ํ•ฉํ•ด ๋‹ค๋ฅธ ํ•ด๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ๋””๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค

๊ตฌํ˜„

  • ์™„์ „ ํƒ์ƒ‰์€ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฃผ์ € ์—†์ด ๋‹ค ๊ณ„์‚ฐํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค
  • ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ๋ฌธ์ œ์—์„œ ์ œ์‹œํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•œ ๋‹จ๊ณ„์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์ง์ ‘ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ ์œ ํ˜•์„ ์˜๋ฏธํ•œ๋‹ค
  • ์ผ๋ฐ˜์ ์œผ๋กœ 1์ดˆ = 2์ฒœ๋งŒ ~ 1์–ต ๋ฒˆ ์ •๋„์˜ ์—ฐ์‚ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค
  • ์‹œ๊ฐ„ ์ œํ•œ์ด 1์ดˆ์ด๊ณ , ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ 100๋งŒ์ด๋ผ๋ฉด O(NlogN)์ด ๋˜๋„๋ก ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค

DFS/BFS

  • ์Šคํƒ๊ณผ ํ๋ฅผ ํ™œ์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค
  • ์Šคํƒ์€ ๋‹จ์ˆœ ํŒŒ์ด์ฌ ๋ฆฌ์ŠคํŠธ์˜ append, pop์„ ์ด์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ํ๋Š” collections deque์˜ append์™€ popleft๋ฅผ ์ด์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค

๊ทธ๋ž˜ํ”„

  • ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹๊ณผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค

    • ์ธ์ ‘ ํ–‰๋ ฌ์€ 2์ฐจ์› ๋ฐฐ์—ด์— ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค
    • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •์ ์„ ๋ฐฐ์—ด์— ์ €์žฅํ•˜์—ฌ ๊ธฐ๋กํ•œ๋‹ค
  • ์˜ˆ๋ฅผ ๋“ค์–ด 0๋ฒˆ ๋…ธ๋“œ์™€ 1๋ฒˆ ๋…ธ๋“œ๊ฐ€ 7์˜ ๊ธธ์ด๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ , 0๋ฒˆ ๋…ธ๋“œ์™€ 2๋ฒˆ ๋…ธ๋“œ๊ฐ€ 5์˜ ๊ธธ์ด๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด

  • ์ธ์ ‘ ํ–‰๋ ฌ์€ [ [0, 7, 5], [7, 0, INF], [5, INF, 0] ]

  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ [[(1,7),(2,5)], [(0,7)], [(0,5)]]

  • ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋” ํšจ์œจ์ ์ด๋‹ค

  • ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์–ป๋Š” ์†๋„๋Š” ์ธ์ ‘ ํ–‰๋ ฌ์ด ๋” ํšจ์œจ์ ์ด๋‹ค

DFS

  • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ ๊ธฐ๋ฒ•์œผ๋กœ ๊ทธ๋ž˜ํ”„์˜ ๊นŠ์€ ๋ถ€๋ถ„์„ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค
  • ์Šคํƒ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ ๋…ธ๋“œ์—์„œ ๋ฐฉ๋ฌธ ๋˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธํ•œ๋‹ค.
  • ๋งŒ์•ฝ ๋ฐฉ๋ฌธ ๋˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ์ด์ „ ๋…ธ๋“œ์—์„œ ๋‹ค์‹œ ๋ฐฉ๋ฌธ ๋˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค
  • ๊ธฐ๋ณธ์ ์œผ๋กœ N๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด O(N)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค
  • ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€๋กœ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค

Stack์œผ๋กœ ๊ตฌํ˜„

def solution(arr):
    stack = []
    visited = [0] * len(arr)
    # ์‹œ์ž‘์  stack์— ๋„ฃ๊ธฐ
    stack.append(1)
		visited[1] = 1
    # stack์— ์š”์†Œ๊ฐ€ ์—†์„ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต
    while len(stack) > 0:
				v = stack[-1]
        print(v)
        
				# ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ ‘ ๋…ธ๋“œ ํ™•์ธ
        flag = False
        for i in arr[v]:
            if visited[i] == 0:
								visited[i] = 1
                flag = True
                stack.append(i)
                break
        # ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ ‘ ๋…ธ๋“œ ์—†์œผ๋ฉด pop
        if flag is False:
            stack.pop()

Recursive๋กœ ๊ตฌํ˜„

def solution(start, arr):
    # Visited ์ •์˜
    visited = [False] * len(arr)
		visited[start] = True
		
    # ๊ฐ ๋…ธ๋“œ ๋ณ„๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” DFS ํ•จ์ˆ˜ ์ •์˜
    def DFS(loc, arr, visited):
				visited[loc] = True
        # ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ ํƒ์ƒ‰
        for i in arr[loc]:
            # ๋ฐœ๊ฒฌ ์‹œ ๋ฐฉ๋ฌธ 
            if not visited[i]:
                DFS(i,arr, visited)
		
    DFS(start,arr, visited)

BFS

  • ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ ๊ธฐ๋ฒ•์œผ๋กœ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค
  • ํ์— ์‹œ์ž‘์ ์„ ์‚ฝ์ž…ํ•œ๋‹ค
  • ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ๋˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค
  • ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ ๊นŒ์ง€ ์œ„์˜ ๊ณผ์ •๋“ค์„ ๋ฐ˜๋ณตํ•œ๋‹ค
  • BFS ์—ญ์‹œ N๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด O(N)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค
  • ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ BFS๊ฐ€ DFS ๋ณด๋‹ค ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ข‹์€ ํŽธ์ด๋‹ค
from collections import deque

def solution(start, arr):
    queue = deque([start])
    visited = [False] * len(arr)
		visited[start] = True

    while len(queue) > 0:
        v = queue.popleft()
        for i in arr[v]:
            if visited[i] == 0:
                queue.append(i)
				visited[i] = True

์ •๋ ฌ

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋ฉด ์ด์ง„ ํƒ์ƒ‰ ๋˜ํ•œ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค
  • ์„ ํƒ ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ๊ณ„์ˆ˜ ์ •๋ ฌ

์„ ํƒ ์ •๋ ฌ

  • ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์„ ํƒ ํ•œ๋‹ค
arr = [7,5,9,0,3,1,6,2,4,8]
# i๋ฒˆ์งธ ์ „์€ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ
# i๋ฒˆ์งธ ํ›„์˜ ๊ฐ’๋“ค ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ '์„ ํƒ'ํ•ด์„œ i๋ฒˆ์งธ๋กœ ์ด๋™
for i in range(len(arr)):
	min_index = i
	for j in range(i+1, len(arr)):
		if arr[min_index] > arr[j]:
			min_index = j
	# ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ i๋ฒˆ์งธ๋กœ ์ด๋™
	arr[i], arr[min_index] = arr[min_index], arr[i] # swap
  • N + N - 1 + โ€ฆ 1 = O(N^2)
  • ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„๋‹ˆ๋‚˜ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ๋ฆฌ์ŠคํŠธ์—์„œ ์ตœ์†Œ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ต์ˆ™ํ•ด์งˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค

์‚ฝ์ž… ์ •๋ ฌ

  • ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•œ ์œ„์น˜์— โ€˜์‚ฝ์ž…โ€™ํ•œ๋‹ค
  • ํ•„์š”ํ•  ๋•Œ๋งŒ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฑฐ์˜ ์ •๋ ฌ๋˜์–ด ์žˆ์„ ๋•Œ ๋” ํšจ์œจ์ ์ด๋‹ค
  • ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋Š” ์ •๋ ฌ์ด ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ •๋ ฌ์„ ์‹œ์ž‘ํ•œ๋‹ค
  • ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์–ด๋Š ์œ„์น˜์— ๋“ค์–ด๊ฐ€์•ผ ํ• ์ง€ ํŒ๋‹จํ•˜์—ฌ ํ•ด๋‹น ์œ„์น˜์— ์‚ฝ์ž…ํ•œ๋‹ค
arr = [7,5,9,0,3,1,6,2,4,8]
# 0๋ฒˆ์€ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ
# i๋ฒˆ์งธ ๊ฐ’์„ ์™ผ์ชฝ ๊ฐ’๋“ค๊ณผ ๋น„๊ตํ•˜๋ฉฐ ์ ์ ˆํ•œ ์œ„์น˜์— '์‚ฝ์ž…'
for i in range(1, len(arr)):
	for j in range(i,0,-1):	
		if arr[j] < arr[j-1]:
			arr[j], arr[j-1] = arr[j-1], arr[j]
		else:
			break
  • ์‚ฝ์ž… ์ •๋ ฌ ์—ญ์‹œ O(N^2)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค
  • ํ•˜์ง€๋งŒ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฑฐ์˜ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ O(N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค
  • ๋ณดํ†ต ํ€ต ์ •๋ ฌ์ด ๋” ํšจ์œจ์ ์ด์ง€๋งŒ ์ •๋ ฌ์ด ๊ฑฐ์˜ ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฝ์ž…์ •๋ ฌ์ด ๋” ๋น ๋ฅด๊ธฐ๋„ ํ•˜๋‹ค

ํ€ต ์ •๋ ฌ

  • ๋ณ‘ํ•ฉ ์ •๋ ฌ๊ณผ ํ•จ๊ป˜ ๊ฐ€์žฅ ๋น ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค
  • ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ๊ธฐ์ค€๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค
  • ์™ผ์ชฝ์—์„œ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ณ  ์˜ค๋ฅธ์ชฝ์—์„œ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„ ๋‘ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค
  • ์œ„์˜ ์ž‘์—…์„ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋‹ค ๋‘ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๊ฐ€ ์—‡๊ฐˆ๋ฆฐ ๊ฒฝ์šฐ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ์™€ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ ๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค
  • ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ๊ณผ ์™ผ์ชฝ์ด ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ์— ๋Œ€ํ•ด ๋‹ค์‹œ ํ€ต ์ •๋ ฌ์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•œ๋‹ค
  • ์ข…๋ฃŒ ์กฐ๊ฑด์€ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๊ฐ€ 1๊ฐœ์ผ ๊ฒฝ์šฐ์ด๋‹ค
arr = [5,7,9,0,3,1,6,2,4,8]

def quickSort(arr, start, end):
	pivot = start
	left = start + 1
	right = end
	while left <= right:
		while right > start and arr[right] >= arr[pivot]:
			right -= 1
		while left < end and arr[left] <= arr[pivot]:
			left += 1 
		if left > right:
			arr[right], arr[pivot] = arr[pivot], arr[right]
			break
		else:
			arr[left], arr[right] = arr[right], arr[left]
	quickSort(arr, right+1, end)
	quickSort(arr, start, right-1)
  • ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(NlogN)์ด๋‹ค
  • ํ•˜์ง€๋งŒ ํ”ผ๋ด‡์„ ์ž˜๋ชป ์„ค์ •ํ•  ์ตœ์•…์˜ ๊ฒฝ์šฐ O(N^2)์ด๋‹ค

๊ณ„์ˆ˜ ์ •๋ ฌ

  • ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฒ”์œ„ ์ œํ•œ์ด ๋˜์–ด ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ๋น ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค
  • ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ N, ์ตœ๋Œ€๊ฐ’์ด K์ด๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ O(N+K)๋ฅผ ๋ณด์žฅํ•œ๋‹ค
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ํฐ ๋ฐ์ดํ„ฐ์™€ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ ์ฐจ์ด๊ฐ€ 1,000,000์„ ๋„˜์ง€ ์•Š์„ ๋•Œ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค
arr = [7,5,9,0,3,1,6,2,9,1,4,8,0,5,2]
count = [0] * (max(arr) + 1)
for i in range(len(arr)):
	count[arr[i]] += 1

ํŒŒ์ด์ฌ ์ •๋ ฌ

  • sorted()๋Š” ๋ณ‘ํ•ฉ ์ •๋ ฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ ํ€ต ์ •๋ ฌ๋ณด๋‹ค๋Š” ๋Š๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ O(NlogN)์„ ๋ณด์žฅํ•œ๋‹ค

  • ๋ฆฌ์ŠคํŠธ ๋‚ด๋ถ€์˜ sort() ํ•จ์ˆ˜๋กœ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

  • sorted(), sort()์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ key๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” ์ •๋ ฌ์˜ ๊ธฐ์ค€์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ•จ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค

  • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ๋Š” 3๊ฐ€์ง€์˜ ์ •๋ ฌ ๋ฌธ์ œ๋กœ ๊ตฌ๋ถ„๋  ์ˆ˜ ์žˆ๋‹ค

    • ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ
    • ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ์— ๋Œ€ํ•ด์„œ ๋ฌผ์–ด๋ณด๋Š” ๋ฌธ์ œ
    • ๋” ๋น ๋ฅธ ์ •๋ ฌ์ด ํ•„์š”ํ•œ ๋ฌธ์ œ

์ด์ง„ ํƒ์ƒ‰

  • ์ˆœ์ฐจ ํƒ์ƒ‰์€ ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์žˆ๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์•ž์—์„œ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค

  • ์ด์ง„ ํƒ์ƒ‰์€ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

  • ์ฐพ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ์™€ ์ค‘๊ฐ„ ์ง€์ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋น„๊ตํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค

    def binSearch(arr, target, start, end):
    	if start > end:
    		return none
    	mid = (start + end) // 2
    	if arr[mid] == target:
    		return mid
    	elif arr[mid] > target:
    		return binSearch(arr, target, start, mid - 1)
    	else:
    		return binSearch(arr, target, mid+1, end)
  • ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ 2000๋งŒ์„ ๋„˜์–ด๊ฐ€๋ฉด ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

  • ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ž‘๋‹ค
  • ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ํฌ๋‹ค

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

  • ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์•ฝ๊ฐ„ ๋” ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋น„์•ฝ์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด ์žˆ๋‹ค
  • ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์ ํ™”์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด a_n+2=f(a_n+1,a_n)=a_n+1+ana\_{n+2} = f(a\_{n+1}, a\_n) = a\_{n+1} + a_n
dp = [0] * 100
def fibo(x):
	if x == 1 or x == 2:
		return 1
	if dp[x] != 0:
		return dp[x]
	dp[x] = fibo(x-1) + fibo(x-2)
	return dp[x]
  • O(2N)O(2^N)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค

  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋‹ค์Œ์˜ ๊ฒฝ์šฐ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

    1. ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค
    2. ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ •๋‹ต์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•˜๋‹ค
    dp = [0] * 100
    def fibo(x):
    	if x == 1 or x == 2:
    		return 1
    	if dp[x] != 0:
    		return dp[x]
    	dp[x] = fibo(x-1) + fibo(x-2)
    	return dp[x]
  • ๋‹ค์ด๋‚ด๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ O(N)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค

  • ์ด๋Š” ํƒ‘ ๋‹ค์šด ๋ฐฉ์‹์œผ๋กœ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค

    dp = [0] * 100
    dp[1] = 1
    dp[2] = 2
    n = 99
    for i in range(3, n+1):
    	dp[i] = dp[i-1] + dp[i-2]
  • ์ด ๋ฐฉ์‹์€ ๋ฐ”ํ…€์—… ๋ฐฉ์‹์ด๋‹ค

์ตœ๋‹จ ๊ฒฝ๋กœ

  • ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์–‘ํ•œ ์œ ํ˜•์ด ์กด์žฌํ•œ๋‹ค

    • ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ํŠน์ • ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ
    • ๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ๋ณดํ†ต ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„ํ•œ๋‹ค

  • ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ํ”„๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

๋‹ค์ต์ŠคํŠธ๋ผ

  • ๊ทธ๋ž˜ํ”„์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ํŠน์ •ํ•œ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค

  • ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Œ์˜ ๊ฐ„์„ ์ด ์—†์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค

  • ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค

    1. ์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ ์„ค์ •
    2. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”
    3. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค
    4. ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค
    5. ์œ„์˜ ๊ณผ์ •์—์„œ 3๊ณผ 4๋ฒˆ์„ ๋ฐ˜๋ณตํ•œ๋‹ค
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ํ•ญ์ƒ 1์ฐจ์› ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•˜๋ฉฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ณ„์† ๊ฐฑ์‹ ํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค

  • ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ๋Š๋ฆฐ ์ฝ”๋“œ์™€ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต์ง€๋งŒ ๋น ๋ฅธ ์ฝ”๋“œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค

์‰ฌ์šด ๋ฒ„์ „ : O(V^2)

def dijkstra(arr):
    cur = 1
    visited = [0] * (N+1)
    costs = [INF] * (N+1)
    costs[1] = 0
    def getSmallest():
        minValue = INF
        index = -1
        for idx in range(1,N+1):
            if costs[idx] < minValue and visited[idx] == 0:
                minValue = costs[idx]
                index = idx
                
        return index
    
    for i in range(1,len(costs)-1):
        cur = getSmallest()
        visited[cur] = 1
        for j in range(1,N+1):
            # cur์—์„œ j ๊นŒ์ง€ ๊ฐ€๋ฆฌ
            if j != cur:
                for k in arr:
                    if k[0] == cur and j == k[1]:
                        costs[j] = min(costs[j], costs[cur]+k[2])
  • ๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ 5000๊ฐœ ์ดํ•˜๋ฉด ์œ„์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋„ ์ข‹๋‹ค

๊ฐœ์„ ๋œ ๋‹ค์ต์ŠคํŠธ๋ผ @ : O(ElogV)

  • ํž™์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ •๋ ฌํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•œ๋‹ค
  • heapq ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
  • heapq๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ min heap ๋ฐฉ์‹์ด๋‚˜ -๋ฅผ ๋ถ™์—ฌ max heap์œผ๋กœ๋„ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค
  • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค
def dijkstr(arr):
    start = 1
    costs = [INF] * (N+1)
    costs[1] = 0
    q = []
    heapq.heappush(q,(0,start))
    while q:
        dist, cur = heapq.heappop(q)
        if distance[cur] < dist:
            continue
        for j in arr:
            if j[0] == cur:
                if costs[j[1]] > (dist + j[2]):
                    costs[j[1]] = dist + j[2]
                    heapq.heappush(q,(dist + j[2], j[1]))

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ

  • ๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๋‹จ๊ณ„๋งˆ๋‹ค ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๋ฉฐ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค

  • ๋”ฐ๋ผ์„œ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ N-1๊ฐœ์˜ ๋…ธ๋“œ ์ค‘ ๋‘ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋‘ ๋…ธ๋“œ ์‚ฌ์ด์— ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค

  • ๋”ฐ๋ผ์„œ ์ „์ฒด N๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด N-1 P 2๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰ ๋˜๊ธฐ์— O(N^3)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค

  • K ๋ฒˆ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ์ ํ™”์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

    D_ab=min(D_ab,D_ak+D_kb)D\_{ab} = min(D\_{ab}, D\_{ak} + D\_{kb})

def floydWarshall(arr):
    dist = [[INF for j in range(N+1)] for i in range(N+1)]
    # ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”
    for i in range(1,N+1):
        dist[i][i] = 0
        for k in arr:
            if k[0] == i:
                dist[i][k[1]] = k[2]
    for i in range(1,N+1):
        # i๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ฒฝ์šฐ
        for start in range(1,N+1):
            if start == i:
                continue
            for end in range(1,N+1):
                if end == i or end == start:
                    continue
                print(start,"์—์„œ",end,"๊นŒ์ง€",i,"๋ฅผ ๊ฑฐ์นจ :",dist[start][end],dist[start][i]+dist[i][end])
                dist[start][end] = min(dist[start][end], dist[start][i] + dist[i][end])
    print(dist)

๊ทธ๋ž˜ํ”„ ์ด๋ก 

  • ๊ทธ๋ž˜ํ”„์™€ ํŠธ๋ฆฌ๋กœ ๊ธฐ๋ณธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค
  • ํ‘œํ˜„ ๋ฐฉ์‹์€ ์ธ์ ‘ ํ–‰๋ ฌ๊ณผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์ด ์žˆ๋‹ค
  • ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ์ธ์ ‘ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋…ธ๋“œ ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋‹ค
  • ๋…ธ๋“œ ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋ฉด ๋‹ค์ต์ŠคํŠธ๋ผ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค

์„œ๋กœ์†Œ ์ง‘ํ•ฉ

  • ๊ณตํ†ต ์›์†Œ๊ฐ€ ์—†๋Š” ์ง‘ํ•ฉ

  • ์„œ๋กœ์†Œ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” union, find ์—ฐ์‚ฐ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค

  • ์„œ๋กœ์†Œ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ๋‹ค

    Ex) ์ „์ฒด ์ง‘ํ•ฉ : {1,2,3,4,5,6}

    • union 1, 4
    • union 2, 3
    • union 2, 4
    • union 5, 6

    ์—ฌ๊ธฐ์„œ ๊ฐ ์›์†Œ๋Š” ๋…ธ๋“œ, ๊ฐ union ์—ฐ์‚ฐ์€ ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค

    union A,B
     1. A์™€ B์˜ ๋ถ€๋ชจ๋…ธ๋“œ A`, B` ์„ ๊ฐ๊ฐ ์ฐพ๋Š”๋‹ค
     2. A`์„ B`์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ์„ค์ •ํ•œ๋‹ค (๊ฐ’์ด ๋” ์ž‘์€ ๋ฃจํŠธ๊ฐ€ ๋ฃจํŠธ๊ฐ€ ๋˜๋„๋ก ํ•œ๋‹ค)
    
        1       5
      2   4        6
    3
  • ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์„ ์œ ์ง€ํ•˜์—ฌ ๊ฐ ์›์†Œ๋งˆ๋‹ค์˜ ๋ถ€๋ชจ๋ฅผ ์ €์žฅํ•œ๋‹ค

    parentTable = [i for i in range(1,N+1)]
    
    def findParent(a, parentTable):
    	if parentTable[a] != a:
    		parentTable[a] = findParent(parentTable[a], parentTable)
    	return parentTable[a]
    
    def union(a,b):
    	aParent = findParent(a)	
    	bParent = findParent(b)
    	if aParent > bParent:
    		parentTable[aParent] = bParent
    	else:
    		parentTable[bParent] = aParent
  • ๊ฐ๊ฐ์˜ ์›์†Œ์˜ ์ตœ์ข… ๋ฃจํŠธ๋ฅผ ์ฐพ๊ฒŒ ๋˜๋ฉด ์„œ๋กœ์†Œ๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๊ฐ ์›์†Œ์˜ ๋ฃจํŠธ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(V)์ด๋‹ค

  • ๋”ฐ๋ผ์„œ union์—ฐ์‚ฐ์ด M์ด๋ผ๊ณ  ํ•  ๋•Œ ์ „์ฒด ๋ณต์žก๋„๋Š” O(VM)์ด๋‹ค

  • ์••์ถ• ๊ธฐ๋ฒ•์„ ํ†ตํ•ด์„œ findParent๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ parentTable์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค

์„œ๋กœ์†Œ๋ฅผ ํ†ตํ•œ ์‚ฌ์ดํด ํŒ๋ณ„

  • ์„œ๋กœ์†Œ ํŒ๋ณ„๋ฒ•์€ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด์„ ํŒ๋ณ„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด์€ DFS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค

  • ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉด์„œ ๋‘ ๋…ธ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์‚ฌ์ดํด์„ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค

    1. ๊ฐ ๊ฐ„์„ ์„ ํ™•์ธํ•˜๋ฉฐ ๋‘ ๋…ธ๋“œ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค
    2. ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ ๊ฐ™๋‹ค๋ฉด ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค

์‹ ์žฅ ํŠธ๋ฆฌ

  • ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ์„ ๋•Œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜๋ฉด์„œ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„๋ฅผ ์˜๋ฏธํ•œ๋‹ค

  • ์ตœ์†Œํ•œ์˜ ๋น„์šฉ์œผ๋กœ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ฐพ์•„์•ผํ•˜๋Š” ๊ฒฝ์šฐ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

    • ex) ์ตœ์†Œ ๋น„์šฉ์œผ๋กœ ๋ชจ๋“  ๋„์‹œ๋ฅผ ์—ฐ๊ฒฐ
  • ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์œผ๋กœ ๋ชจ๋“  ๋„์‹œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๋ชจ๋“  ๊ฐ„์„ ์„ ๋น„์šฉ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ์€ ๊ฐ„์„  ๋ถ€ํ„ฐ ํฌํ•จํ•œ๋‹ค

  • ์ด๋•Œ, ์‚ฌ์ดํด์ด ์ƒ๊ธฐ๋Š” ๊ฐ„์„ ์€ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค

  • ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(ElogE)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค

def find_parent(x, parent):
	if parent[x] != x:
		parent[x] = find_parent(parent[x], parent)
	return parent[x}

def union(parent, a, b):
	aParent = find_parent(a, parent)
	bParent = find_parent(b, parent)
	if aParent < bParent:
		parent[bParent] = aParent
	else:
		parent[aParent] = bParent

def kruskal(n, edges):
	# ๋น„์šฉ์ด ์ ์€ ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธ
	parent = [i for i in range(n+1)]
	edges.sort()
	total = 0
	for cost, a, b in edges:
		# ์‚ฌ์ดํด์ด ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ ํฌํ•จํ•˜์ง€ ์•Š์Œ
		if find_parent(a, parent) != find_parent(b,parent):
			union(parent, a, b)
			total += cost

์œ„์ƒ ์ •๋ ฌ

  • ์œ„์ƒ ์ •๋ ฌ์€ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉํ–ฅ์„ฑ์— ๊ฑฐ์Šค๋ฅด์ง€ ์•Š๋„๋ก ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์ด๋‹ค

    • ex) ์„ ์ˆ˜๊ณผ๋ชฉ์„ ๊ณ ๋ คํ•œ ํ•™์Šต ์ˆœ์„œ ์„ค์ •
  • ์œ„์ƒ ์ •๋ ฌ์—์„œ ์ง„์ž… ์ฐจ์ˆ˜๋Š” ํ•ด๋‹น ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค

    1. ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค

    2. ํ๊ฐ€ ๋นŒ๋•Œ ๊นŒ์ง€ ๋‹ค์Œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค

      • ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฐ„์„ ์„ ๊ทธ๋ž˜ํ”„์—์„œ ์ œ๊ฑฐํ•œ๋‹ค
      • ์ƒˆ๋กญ๊ฒŒ ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค
from collections import deque

# arr๋Š” ์ธ์ ‘๋ฆฌ์ŠคํŠธ
def topology_sort(arr):
	result = []
	q = deque()
	indegree = [0 for i in range(n+1)]
	graph = [[] for i in range(n+1)]
	# ์ง„์ž… ์ฐจ์ˆ˜ ํ…Œ์ด๋ธ”, ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
	for a, b in arr:
		indegree[b] += 1
		graph[a].append(b)
	
	for i in range(1, n+1):
		if indegree[i] == 0:
			q.append(i)
	
	while q:
		cur = q.popleft()
		result.append(cur)
		# ํ˜„์žฌ ๋…ธ๋“œ์˜ ๊ฐ„์„  ์ œ๊ฑฐ
		for adj in graph[cur]:
			indegree[adj] -= 1
			if indegree[adj] == 0:
				q.append(adj)
	
	return result

ยฉ 2023 Sangyun Lee, Powered By Gatsby.