inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

2주만에 통과하는 알고리즘 코딩테스트 (2024년)

다익스트라

다익스트라 강의 관련 질문이 있습니다.

해결된 질문

396

DaBin Han

작성한 질문수 2

1

설명해주신 다익스트라 알고리즘 코드를 보면

32~33번째 줄에서 아래 조건이 만족하면 무조건 우선순위 큐에 nxt 정점이 추가되는데요.

if dist[node] + weight < dist[nxt] 

 

이런 경우 nxt 까지 도달할 수 있는 거리 정보가 업데이트 될 때마다, 우선순위 큐에 nxt 노드가 중복으로 삽입될 수 있는 것 같은데요

 

질문 1.

visit 여부를 확인하는 방식 등으로 우선 순위 큐에 중복으로 넣는 코드를 제거할 수 있을 것 같은데, visit 배열이 빠진 이유가 있나요?

 

질문 2.

그리고 우선순위큐에 중복으로 노드가 존재하게되어도 동작이나 성능 측면에서 문제가 없을지 궁금합니다

python 코딩-테스트 알고리즘

답변 2

0

코딩 센세

안녕하세요? 답변이 다소 늦어서 죄송합니다! 🙂

우선순위큐에 중복 노드 삽입은 어느 정도 존재할 수는 있으나(나중에 방문한 경로가 최단거리일 수 있기 때문에), 원소를 빼는 과정에서 최적화를 추가해 줄 필요성은 있습니다.

이를테면, 우선순위큐에서 원소를 뺄 때, 해당 원소가 가지고 있는 거리값이 dist에 저장되어 있는 노드의 최단거리보다 크다면 while문을 건너 뛰고 continue 하는 로직을 추가해주는 것입니다. 그렇게 하면 노드가 중복 삽입되더라도 중복 삽입된 노드 중 최단경로일 때만 인접 노드를 재방문하는 for문이 실행될 것입니다.

제공해주신 사진에서는 26 ~ 28번 라인 사이에 비교 로직을 추가하는 것이 좋습니다.

잘못 구현한 다익스트라 알고리즘 저격하기 (infossm.github.io)

상기 글을 참고하시면 도움이 많이 될 것 같습니다 🙂

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

답변 드리기 전에 해당 강의의 ‘수강 전 문의 게시판’을 활용하는 방법을 추천드립니다. 수강 전 문의 게시판을 통해 해당 강의의 지식공유자인 DaBin Han님께 직접 문의를 하실 수 있어요. 수강 전 문의하기 기능이 구성된 강의에 한해서 이용할 수 있으니, 강의 상세 페이지에서 해당 기능이 제공되는지 확인해보시길 바랍니다.

질문 1에 대한 답변:
다익스트라 알고리즘에서는 방문 여부를 확인하는 visit 배열 대신 거리 배열인 dist를 사용하여 최단 거리를 업데이트하는 방식을 통해 구현할 수 있습니다. visit 배열을 사용하지 않은 구현 방식은 간선의 가중치가 모두 양수일 경우, 최소 힙(min heap)을 활용하여 이미 방문한 노드를 걸러낼 수 있기 때문에 visit 배열 없이도 올바르게 동작합니다. 하지만 알고리즘의 판단 직전에 방문 여부를 확인하는 것도 하나의 최적화 방법이 될 수 있습니다.

질문 2에 대한 답변:
우선순위 큐에 노드가 중복으로 삽입되는 경우, 알고리즘은 여전히 정확하게 동작하지만, 큐에 불필요한 요소들이 쌓이면서 성능 저하를 일으킬 수 있습니다. 이는 큐에서 원소를 꺼냈을 때, 이미 방문해 거리가 업데이트된 노드는 무시하게 됨으로써 해결되긴 하지만, 중복된 노드들이 큐에 존재함으로 인해 최악의 경우 시간 복잡도에 영향을 줄 수 있습니다. 그럼에도 불구하고 우선순위 큐를 이용한 구현은 간편하고 가독성이 좋아 많이 사용되는 방식입니다.

알고리즘과 자료구조에 대한 궁금증 해결에 도움이 되셨기를 바라며, 추가적인 궁금한 사항이 있다면 인프런의 ‘문의하기’ 기능을 통해 질문하실 수 있다는 점을 알려드립니다. 알고리즘 학습에 성공하시길 바랍니다.

감사합니다.

dp[x]가 최대값이라고 확신할수 있는 이유

0

45

1

1090번 문제 질문

0

150

1

유니온파인드

0

112

1

투포인터 25:15 질문

1

128

1

#1090번 문제 반례가 궁금합니다.

0

148

1

예제코드 자바입니다

1

186

1

정수론 파트 #2247 문제에 대한 질문입니다!

0

102

0

코드 오류

0

185

1

2강 정수론 문제3 #1407 질문

0

127

0

이차원 배열 (int형)dp로 0 혹은 -1로 체크하는 방법 말고 boolean형 배열로 체크해서 바로 리턴해줄 수 없나요?

0

154

0

1717번 최적화

0

112

0

백준 22988 문제 질문

1

193

2

[Python] 백준 1090번 문제

1

226

3

강의자료에서

1

162

2

2503 문제 제한 조건 질문!

1

249

2

백준 22988 번 문제

1

193

1

추가 강의 순서

1

180

2

(*문제 풀이)1090 테스트케이스 1번 C++

1

221

2

7강 RGB 색칠하기 질문 있습니다.

1

160

2

정수론 약수 빠르게 구하기 질문

1

257

1

1090 문제의 2, 3번째 아이디어는 결국 같은거 아닌가요?

1

373

2

1090 문제 관련하여 맨해튼 거리 최솟값에 대해 질문 있습니다.

1

223

2

누적합 문제 3번 질문

1

216

2

기억 ( 누적합 ) 강의 11660 문제

1

163

2