99클럽 코테 스터디 3일차 TIL + 다익스트라 알고리즘

2024. 10. 30. 16:42·99클럽 코테 스터디

❇️오늘의 학습 키워드 : 다익스트라 알고리즘

 

다익스트라 알고리즘?

- 가중치가 있는 그래프에서 한 정점에서 다른 모든 정점까지의 최단 경로를 찾는 알고리즘

다익스트라 알고리즘의 동작 원리

    (1) 출발 지점(시작 노드)의 거리를 0으로, 나머지 노드들의 거리는 무한대(INF)로 설정

    (2) 우선순위 큐를 활용해 현재 가장 짧은 거리의 노드를 선택하고, 해당 노드를 중심으로 주변 노드들의 거리 갱신

    (3) 모든 노드를 방문할 때까지 반복

다익스트라라 알고리즘의 특징

- 우선순위 큐 사용시 시간복잡도는 O(ElogV)

- 음수 가중치가 없는 그래프에서 가장 효율적으로 작동

다익스트라 알고리즘에서 우선순위 큐 기능을 활용하는 이유?

- 최소 힙 자료구조로, 가장 작은 값이 항상 맨 앞에 오도록 정렬된 큐임!
    -> 현재까지 계산된 가장 짧은 거리를 먼저 확인하면서 진행해야 효율적임

다익스트라 알고리즘 코드 예제

import heapq
import sys
input = sys.stdin.readline

# 노드와 간선의 수 입력받기
v, e = map(int, input().split())
start = int(input())  # 시작 노드 번호

# 그래프 초기화 및 거리 배열 설정
graph = [[] for _ in range(v + 1)]
distance = [float('inf')] * (v + 1)

# 간선 정보 입력받기
for _ in range(e):
    a, b, c = map(int, input().split())
    graph[a].append((b, c))  # a 노드에서 b 노드로 가는 비용이 c

# 다익스트라 알고리즘 함수
def dijkstra(start):
    q = []
    heapq.heappush(q, (0, start))  # 시작 노드 초기화
    distance[start] = 0

    while q:
        w, node = heapq.heappop(q) # 가중치와 노드인덱스 빼오기
        for nxt, weight in graph[node]:
            # 1. 각각의 노드에 값을 업데이트
            # 2. 만약에 여러 경로가 있다면 min 비교!
            # 3. 시작점으로부터 거리를 봐서, 짧은 순서대로 탐색! (오염방지)
            if distance[node] + weight < distance[nxt]: # 인접한 노드를 거쳐서 다음으로 가기(현재까지의 최솟값+가중치) vs 다음까지 스트레이트로 가기
                distance[nxt] = distance[node] + weight
                heapq.heappush(q,[distance[nxt],nxt])

# 다익스트라 알고리즘 수행
dijkstra(start)

# 모든 노드로의 최단 거리 출력
for i in range(1, v + 1):
    if distance[i] == float('inf'):
        print("INF")  # 도달할 수 없는 경우
    else:
        print(distance[i])

❇️오늘의 회고

  - 항해99 코테스터디 3일차 문제에서 1, 2일차에 공부했던 BFS 및 플로이드-워셜 알고리즘을 복습하고, 추가로 다익스트라 개념을 학습했다.

  - 다익스트라 알고리즘을 이용하는 문제를 많이 풀어서 체화시킬 것!

  - 현재노드인덱스에 (인접노드인덱스, 가중치) 이렇게 쌍으로 묶어서 저장하는 것에 유의한다!

  - 다익스트라 알고리즘을 이용하려면 음수 가중치가 없어야 한다는 것을 잊지 말자! ☺️

저작자표시 (새창열림)

'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클럽 코테 스터디 2일차 TIL + BFS  (0) 2024.10.29
99클럽 코테 스터디 1일차 TIL + 플로이드-워셜 알고리즘  (0) 2024.10.28
'99클럽 코테 스터디' 카테고리의 다른 글
  • 99클럽 코테 스터디 7일차 TIL - 노드 사이의 거리(백준 #1240)
  • 99클럽 코테 스터디 6일차 TIL + DFS 알고리즘
  • 99클럽 코테 스터디 2일차 TIL + BFS
  • 99클럽 코테 스터디 1일차 TIL + 플로이드-워셜 알고리즘
버그잡는고양이발
버그잡는고양이발
주니어 개발자입니다!
  • 버그잡는고양이발
    지극히평범한개발블로그
    버그잡는고양이발
  • 전체
    오늘
    어제
    • 분류 전체보기 (382)
      • React (16)
      • Next.js (5)
      • Javascript (5)
      • Typescript (4)
      • Node.js (2)
      • Cs (16)
      • 트러블 슈팅 (5)
      • 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)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
버그잡는고양이발
99클럽 코테 스터디 3일차 TIL + 다익스트라 알고리즘
상단으로

티스토리툴바