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 |
Tags
- programmers
- 2166번
- 9장
- SerialDate 리펙터링
- 자바의 정석
- 2156번
- Adapater Pattern
- 11286번
- 냄새와 휴리스틱
- 프로그래머스
- BOJ
- 코딩테스트
- 백준
- 클린코드
- java의 정석
- 1043번
- java
- 코딩 테스트
- Design Pattern
- Design Patterns
- 17장
- 1300번
- Spring
- 11758번
- DxTrace
- 2206번
- 가장 긴 증가하는 부분 수열2
- Dxerr.h
- springboot
- 10830번
Archives
- Today
- Total
Don't give up!
[프로그래머스] 합승 택시 요금(java) 본문
코딩테스트 연습 - 합승 택시 요금 | 프로그래머스 (programmers.co.kr)
어떻게 생각하고 문제를 풀었는가?
지점 k에서 A와 B가 택시를 따로 이용하여 목표지점으로 가는 경우 s->k까지의 최소비용 + k->A까지의 최소비용 + k->B까지의 최소비용으로 계산할 수 있습니다.
택시요금은 방향에 따라 달라지지 않습니다. 따라서 s에서 시작하여 각 지점까지의 최소비용, A에서 시작하여 각 지점까지의 최소 비용, B에서 시작하여 각 지점까지의 최소 비용을 미리 계산한 후 모든 k에 대한 비용 중 최소 값을 찾음으로서 전체 최소요금을 구할 수 있습니다.
코드
import java.util.*;
class Solution {
final int MAX = 20000001;
int[][] lines;
public int solution(int n, int s, int a, int b, int[][] fares) {
lines = new int[n][n];
for(int[] fare : fares){
lines[fare[0]-1][fare[1]-1] = fare[2];
lines[fare[1]-1][fare[0]-1] = fare[2];
}
int[] dijkS = dijkstra(s-1,n);
int[] dijkA = dijkstra(a-1,n);
int[] dijkB = dijkstra(b-1,n);
int answer=MAX;
for(int i=0;i<n;i++){
int cost =dijkS[i]+dijkA[i]+dijkB[i];
if(answer>cost) answer = cost;
}
return answer;
}
public int[] dijkstra(int start,int n){
PriorityQueue<int[]> pq = new PriorityQueue<>((x,y)->x[1]-y[1]);
pq.add(new int[]{start,0});
int[] result = new int[n];
Arrays.fill(result,MAX);
result[start]=0;
while(!pq.isEmpty()){
int[] curr = pq.poll();
if(curr[1] > result[curr[0]]) continue; //방문하는 의미가 없음
for(int i=0;i<n;i++){
int cost = lines[curr[0]][i]+result[curr[0]];
if(lines[curr[0]][i]>0 && result[i]>cost){
result[i] = cost;
pq.offer(new int[]{i,cost});
}
}
}
return result;
}
}
dijkstra 알고리즘을 이용하여 시작 위치에서 각 지점까지 가는데 드는 최소 비용을 계산하였습니다.
dijkstra 알고리즘은 비용이 최소인 노선을 사용하여 지점을 방문한 후 지점에 도착하는데 드는 비용을 저장함으로서 구현할 수 있습니다.
S, A, B에서 시작하는 dijkstra 계산결과를 저장한 후, 최소 값이 되는 k를 찾아 비용을 반환합니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 광고 삽입(java) (0) | 2021.05.28 |
---|---|
[프로그래머스] 디스크 컨트롤러(java) (0) | 2021.05.25 |
[프로그래머스] 다단계 칫솔 판매(java) (0) | 2021.05.23 |