Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Python
- 딥러닝
- 백준
- 코드수행
- C++
- pytorch
- MySQL
- Object detection
- cs
- 1단계
- 그리디
- STL
- 자료구조 및 실습
- 구현
- docker
- test-helper
- SWEA
- CS231n
- 파이썬
- 2단계
- 3단계
- AWS
- ubuntu
- 머신러닝
- 모두를 위한 딥러닝 강좌 시즌1
- 실전알고리즘
- 프로그래머스
- 이것이 코딩테스트다 with 파이썬
- 전산기초
- ssd
Archives
- Today
- Total
곰퓨타의 SW 이야기
[프로그래머스 level3 합승 택시 요금] 최단 경로 구하기(ft. 다익스트라, 플로이드 워셜) 본문
해결해야하는 문제는 다음과 같았다.
https://programmers.co.kr/learn/courses/30/lessons/72413
코딩테스트 연습 - 합승 택시 요금
6 4 6 2 [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] 82 7 3 4 1 [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] 14 6 4 5 6 [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4
programmers.co.kr
인접행렬 형식으로 그래프를 저장한 후, '플로이드 워셜' 알고리즘을 활용하는 아이디어를 바탕으로 작성한 코드는 다음과 같다.
def solution(n, s, a, b, fares):
INF = int(1e9)
answer = INF
fare_graph = [[INF]*(n+1) for i in range(n+1)]
for i in range(1,n+1):
fare_graph[i][i] = 0
for st,d,c in fares :
fare_graph[st][d] = c
fare_graph[d][st] = c
for k in range(1,n+1):
for a1 in range(1,n+1):
for b1 in range(1,n+1):
fare_graph[a1][b1] = min(fare_graph[a1][b1], fare_graph[a1][k] + fare_graph[k][b1])
for i in range(1,n+1):
c = fare_graph[s][i] + fare_graph[i][a] + fare_graph[i][b]
if c < answer :
answer = c
return answer
하지만 이는 정확도 테스트는 모두 통과하지만 효율성 테스트에서 26번을 시간 초과로 통과하지 못하였다.
따라서 다익스트라 알고리즘을 활용하는 방법을 생각해보았다.
인접 리스트 형식으로 그래프를 저장한 후, '다익스트라' 알고리즘을 활용하였다.
이렇게 하니, 확인하고자 하는 지점들에 대해서만 최단 경로를 확인하여 효율성 테스트를 통과할 수 있는 것 같았다 !
INF = int(1e9)
# 방문하지 않은 노드 중에서, 가장 최단 거리가 짧은 노드의 번호를 반환
def get_smallest_node(distance, visited,n):
min_value = INF
index = 0 # 가장 최단 거리가 짧은 노드 (인덱스 )
for i in range(1,n+1) :
if distance[i] < min_value and not visited[i] :
min_value = distance[i]
index = i
return index
def dijkstra(start,n,graph):
# 시작 노드에 대해서 초기화
visited = [False] * (n+1)
# 최단 거리 테이블을 무한으로 초기화
distance = [INF] * (n+1)
distance[start] = 0
visited[start] = True
for j in graph[start]:
distance[j[0]] = j[1]
# 시작 노드를 제외한 전체 n-1개의 노드에 대해 반복
for i in range(n-1):
# 현재 최단 거리가 가장 짧은 노드를 꺼내서, 방문 처리
now = get_smallest_node(distance,visited,n)
visited[now] = True
# 현재 노드와 연결된 다른 노드를 확인
for j in graph[now]:
cost = distance[now] + j[1]
# 현재 노드를 거쳐서 다른 노드로 이동하는 거리가 더 짧은 경우
if cost < distance[j[0]] :
distance[j[0]] = cost
return distance
def solution(n, s, a, b, fares):
answer = INF
fare_graph = [[] for i in range(n+1)]
for st,d,c in fares :
fare_graph[st].append((d,c))
fare_graph[d].append((st,c))
common_distance = dijkstra(s,n,fare_graph)
a_distance = dijkstra(a,n,fare_graph)
b_distance = dijkstra(b,n,fare_graph)
for i in range(1,n+1):
c = common_distance[i] + a_distance[i] + b_distance[i]
if c<answer:
answer = c
return answer
'TIL > 프로그래머스' 카테고리의 다른 글
[프로그래머스 level3 광고 삽입] 다이나믹 프로그래밍 활용하기 (0) | 2021.09.10 |
---|---|
[프로그래머스 level3 길 찾기 게임] 이진 트리 및 전위순회, 후위순회 구현하기! (0) | 2021.09.08 |
[프로그래머스 level3 불량 사용자] dictionary와 dfs 활용하기 (0) | 2021.09.05 |
[프로그래머스 level3 여행경로] bfs/dfs 활용하기 (0) | 2021.09.03 |
[프로그래머스 level3 하노이의 탑] 재귀함수 이용하기! (0) | 2021.08.31 |
Comments