๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Coding Test/Algorithms

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์ˆœ์œ„/Python - Lv.3

by The Future Engineer, Lucy 2024. 9. 28.

โ“๋ฌธ์ œ

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๐Ÿ“Œ์œ ํ˜•

๊ทธ๋ž˜ํ”„, Floyd-Warshall

โœ๐Ÿปํ’€์ด

1) ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ
- ์ด๊ธด ๊ทธ๋ž˜ํ”„์™€ ์ง„ ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋งŒ๋“ฆ.
- 1์€ 2๋ฒˆ์„ ์ด๊น€. 1๋ฒˆ์˜ ์ด๊ธด ๊ทธ๋ž˜ํ”„์— 2๋ฒˆ์—๊ฒŒ ์ง„ 5๋ฒˆ ๋…ธ๋“œ๋ฅผ ์—…๋ฐ์ดํŠธ.
- 1์€ ๋ˆ„๊ตฌ์—๊ฒŒ๋„ ์ง€์ง€ ์•Š์Œ.
- 2๋ฒˆ์€ 5๋ฒˆ์„ ์ด๊ธฐ๊ณ , 1, 3, 4๋ฒˆ์—๊ฒŒ ์ง. 1, 3, 4๋ฒˆ ์ด๊ธด ๊ทธ๋ž˜ํ”„์— 5๋ฒˆ์„ ์—…๋ฐ์ดํŠธ.
  5๋ฒˆ ์ง„ ๊ทธ๋ž˜ํ”„์—๋Š” 1, 3, 4๋ฒˆ์„ ์—…๋ฐ์ดํŠธ.
- ๊ฐ ๋…ธ๋“œ์˜ ์ด๊ธด ๊ทธ๋ž˜ํ”„์™€ ์ง„ ๊ทธ๋ž˜ํ”„์˜ ๊ธธ์ด์˜ ํ•ฉ์ด n - 1๊ณผ ๊ฐ™๋‹ค๋ฉด answer๋ฅผ 1 ์ฆ๊ฐ€.

2) Floyd-Warshall
- 1๋ฒˆ์ด 2๋ฒˆ์„ ์ด๊น€. graph[2][1]์„ 1๋กœ ์ดˆ๊ธฐํ™”. ์ด์™€ ๊ฐ™์ด ์ง„ ๋ถ€๋ถ„์€ 1๋กœ ์ดˆ๊ธฐํ™”.
- ๊ทธ๋ž˜ํ”„๋ฅผ ๋”ฐ๋ผ DP๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ตœ์†Œ ๊ฒฝ๋กœ ๊ณ„์‚ฐ.
- INF๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ, ์ฆ‰ ์ˆœ์œ„๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด count๋ฅผ 1 ์ฆ๊ฐ€.
- count๊ฐ€ n-1๊ณผ ๊ฐ™๋‹ค๋ฉด answer์„ 1 ์ฆ๊ฐ€.

๐Ÿ’ป์ฝ”๋“œ

# ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ
from collections import defaultdict

def solution(n, results):
    answer = 0
    win, lose = defaultdict(set), defaultdict(set)

    for i, j in results:
        win[i].add(j)
        lose[j].add(i)

    for i in range(1, n + 1):
        for w in win[i]:
            lose[w].update(lose[i])
        for l in lose[i]:
            win[l].update(win[i])

    for i in range(1, n + 1):
        if len(win[i]) + len(lose[i]) == n - 1:
            answer += 1

    return answer
# Floyd-Warshall

def solution(n, results):
    answer = 0
    INF = 1e9
    
    graph = [[INF] * (n + 1) for _ in range(n + 1)]
    
    for i, j in results:
        graph[j][i] = 1 
    
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            if i == j:
                graph[i][j] = 0
                
    for k in range(1, n + 1):
        for i in range(1, n + 1):
            for j in range(1, n + 1):
                graph[i][j] = min(graph[i][k] + graph[k][j], graph[i][j])
                
    for i in range(1, n + 1):
        count = 0
        for j in range(1, n + 1):
            if graph[i][j] != INF or graph[j][i] != INF:
                count += 1 
        if count == n:
            answer += 1
    
    return answer

๐Ÿ’ก์ƒˆ๋กœ ๋ฐฐ์šด ๋‚ด์šฉ

Floyd-Warshall
- ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์Œ.
- ์–‘•์Œ์ˆ˜ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
- ๋ฐฉํ–ฅ, ๋ฌด๋ฐฉํ–ฅ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
- ๋ชจ๋“  ๋…ธ๋“œ ์‚ฌ์ด์˜ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•˜์—ฌ DP๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธ.
- ๋„คํŠธ์›Œํฌ ๋ฐ ์—ฐ๊ฒฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์šฉ์ด.

Pseudo-Code
------------------------------------------------------------------------------------------------
For i = 0 to n – 1
For j = 0 to n – 1
Distance[i, j] = min(Distance[i, j], Distance[i, k] + Distance[k, j])

where i = source Node, j = Destination Node, k = Intermediate Node