상세 컨텐츠

본문 제목

합승 택시 요금

코딩테스트/최단 경로

by 수타. 2023. 7. 6. 18:42

본문

https://school.programmers.co.kr/learn/courses/30/lessons/72413

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명:

노드와 엣지가 주어지고 출발지는 같고 목적지가 두개이다. 이때 택시를 타는것처럼 중간까지 같이가는경우는 한번만 비용을 낸다고 할때 목적지까지 도달하는 최소금액을 구하여라.

 

소요시간:

15분

난이도3

 

코딩:

def solution(n, s, a, b, fares):
	#플로이드로 전구간 이동경로 구하기
	INF = int(1e9)
	graph = [[INF]* (n+1) for _ in range(n+1)]
	for i in range(n+1):
		graph[i][i] = 0
	
	for start,end,cost in fares:
		graph[start][end] = cost
		graph[end][start] = cost

	for k in range(1,n+1):
		for y in range(1,n+1):
			for x in range(1,n+1):
				if graph[y][x] >graph[y][k] +graph[k][x]:
					graph[y][x] = graph[y][k] +graph[k][x]

	#합승을 하지않고 각자 이동하는경우
	ans = [graph[s][a]+graph[s][b]]

	#출발과 도착지점을 제외한 다른곳을 경유하면서 들르는 경우들의 합집합
	for i in range(1,n+1):
		if i !=[s,a,b]:
			ans.append(graph[s][i]+graph[i][a]+graph[i][b])

	return min(ans)

먼저 이문제를 보고, 완전탐색이 아닌 방법이 있을까 생각을 해보았고, n의 개수가 크지 않았기 때문에, 완전탐색을 해야겠다고 생각했습니다. 또한 특정 지점부터 특정 지점까지만 가는것이 필요하다면 다익스트라 알고리즘이 더 빠르지만 모든경우의 수가 필요하기 때문에 플로이드 알고리즘을 사용했습니다.

그래서 플로이드로 모든구간에 대한 코스트를 구한다음, 경유하지않고 다른지점을 들리는경우를 추가 후,

s,a,b즉 출발지점과 도착지점이 아닌 다른지점을 경유하는 경우 경유하는곳까지 cost그리고 거기서부터 양 도착지에까지 가는데 드는 cost를 합쳐주어 더해준 뒤, 그들 중 제일 작은 값을 찾아주었습니다.

 

피드백 :

추가적으로 다익스트라(우선순위큐)의 경우시간복잡도가O(nlogn)이어서, 모든 중간 노드를 기준으로 다익스트라를 구성하면 O(n^3logn)이기 때문에 플로이드 워셜을 사용한 것인데, 다익스트라 3번으로 할수 있는 알고리즘이 있다하여 찾아보는중이다. 

(추후 추가예정)

'코딩테스트 > 최단 경로' 카테고리의 다른 글

운동  (0) 2023.09.15
부대복귀  (0) 2023.07.15
정확한 순위  (0) 2023.06.13
플로이드  (0) 2023.06.09
특정 거리의 도시 찾기  (0) 2023.06.02

관련글 더보기