99클럽 코테 스터디 1일차 TIL + 플로이드-워셜 알고리즘

2024. 10. 28. 12:47·99클럽 코테 스터디

❇️오늘의 학습 키워드 : 플로이드-워셜 알고리즘

 

플로이드-워셜 알고리즘?

- 모든 정점 간의 최단 경로를 구하기 위한 알고리즘

- 한 정점에서 모든 다른 정점까지의 최단 거리를 구하는 다익스트라와 달리, 모든 정점 쌍에 대해 최단 경로를 찾는 데 집중!

플로이드-워셜 알고리즘의 동작 원리

- 동적 계획법을 이용해 최단 경로를 점진적으로 구해나간다.

-  경유지 k를 하나씩 추가하면서, i -> j 로 바로 가는 것보다 i -> k -> j 로 가는 경로가 더 짧으면 최단 거리 테이블을 갱신

    (1) i == j 인 경우 0으로 설정 + 간선이 존재하는 i -> j 에 대해 가중치 입력. 경로가 없으면 INF로 초기화

    (2) 정점 k를 경유지로 사용해, k를 경유해서 가는 경로가 더 짧으면 모든 i -> j 쌍을 i -> k -> j로갱신

    (3) 모든 i -> j 에 대해 최단 거리가 테이블에 기록됨

플로이드-워셜 알고리즘의 특징

- 세 개의 for문을 사용하기 때문에 시간복잡도는 O(n^3) -> 정점 수 크면 비효율적!

- 모든 정점 쌍에 대한 최단 거리를 한 번에 구할 수 있음

- 음수 가중치가 포함된 그래프에서도 최단 경로를 구할 수 있음

플로이드-워셜 알고리즘 코드 예제

# 무한대 값을 나타내기 위해 매우 큰 수로 설정
INF = float('inf')

def floyd_warshall(n, graph):
    # dp 테이블 초기화 (최단 거리 테이블)
    dp = [[INF] * n for _ in range(n)]
    
    # 그래프 초기화
    for i in range(n):
        for j in range(n):
            if i == j:      # 자기 자신까지의 거리는 0
                dp[i][j] = 0
            elif graph[i][j] != 0:  # 간선이 존재하면 그 가중치로 초기화
                dp[i][j] = graph[i][j]
    
    # 경유지 k를 통한 최단 거리 갱신
    for k in range(n):      # k는 경유지
        for i in range(n):  # i는 출발지
            for j in range(n):  # j는 도착지
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])

    return dp

 

❇️오늘의 회고

  - 항해99 코테스터디 1일차 문제를 통해 놓치고 있었던 플로이드 워셜 알고리즘에 대해서 정확히 학습할 수 있었다.

  - 1일차 문제를 풀 때 처음엔 dp 테이블을 만들었었는데, 최단경로를 구하는 것이 아니므로 굳이 이용할 필요가 없어 삭제하고 주어진 테이블에 덮어쓰기했다.

  - 플로이드-워셜 알고리즘은 구현이 간단하지만 3중 for문으로 시간복잡도가 문제라 정점 수를 꼭 확인해야 한다! 이번 문제에서는 100개밖에 되지 않아 이용할 수 있었다.

  - 내일 11시, 문제를 풀기 전에 위 개념을 한번 더 복습하고 내일 문제에 사용된 알고리즘에 대해서 공부할 것이다!🙂

저작자표시 (새창열림)

'99클럽 코테 스터디' 카테고리의 다른 글

99클럽 코테 스터디 8일차 TIL - 녹색 옷 입은 애가 젤다지?(백준 #4485)  (2) 2024.11.04
99클럽 코테 스터디 7일차 TIL - 노드 사이의 거리(백준 #1240)  (3) 2024.11.03
99클럽 코테 스터디 6일차 TIL + DFS 알고리즘  (0) 2024.11.02
99클럽 코테 스터디 3일차 TIL + 다익스트라 알고리즘  (0) 2024.10.30
99클럽 코테 스터디 2일차 TIL + BFS  (0) 2024.10.29
'99클럽 코테 스터디' 카테고리의 다른 글
  • 99클럽 코테 스터디 7일차 TIL - 노드 사이의 거리(백준 #1240)
  • 99클럽 코테 스터디 6일차 TIL + DFS 알고리즘
  • 99클럽 코테 스터디 3일차 TIL + 다익스트라 알고리즘
  • 99클럽 코테 스터디 2일차 TIL + BFS
버그잡는고양이발
버그잡는고양이발
주니어 개발자입니다!
  • 버그잡는고양이발
    지극히평범한개발블로그
    버그잡는고양이발
  • 전체
    오늘
    어제
    • 분류 전체보기 (383) N
      • React (16)
      • Next.js (5)
      • Javascript (5)
      • Typescript (4)
      • Node.js (2)
      • Cs (16)
      • 트러블 슈팅&리팩토링 (6) N
      • Html (1)
      • Css (3)
      • Django (0)
      • vue (0)
      • Java (2)
      • Python (0)
      • 독서 (1)
      • 기타 (3)
      • 백준 (192)
      • swea (31)
      • 프로그래머스 (30)
      • 이코테 (4)
      • 99클럽 코테 스터디 (30)
      • ssafy (31)
      • IT기사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    Til
    개발자취업
    코딩테스트준비
    99클럽
    항해99
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
버그잡는고양이발
99클럽 코테 스터디 1일차 TIL + 플로이드-워셜 알고리즘
상단으로

티스토리툴바