본문 바로가기
programming/알고리즘

[PG, 자바] 합승택시요금

by s2econd.blue 2022. 9. 20.

0. 문제 링크

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

 

프로그래머스

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

programmers.co.kr


1. 문제 핵심

어느 지점에서 헤어질 것인지 구하는 것이 중요.

 


2. 문제 접근

첫 접근법

처음에는 각 지점별로 다익스트라를 통해서 최단 길이를 구하고

시작 지점 ~ 중간 지점 비용 + 중간 지점 ~ 끝 지점1 비용 + 중간 지점 ~ 끝 지점 2 비용을 더하는 방식으로 문제를 풀었습니다.

 

두번째 접근법

대부분의 케이스가 통과했지만 두 케이스에서 시간초과가 나서 시작 ~ 중간 ~ 끝 지점을 구하는 게 혹시  플루이드 워샬 방식이라 생각이 들었고 질문을 통해 확인을 해서 해당 방식으로 문제를 풀었습니다.


3. 베스트 코드 분석


4. 문제 후기

플루이드 워샬 문제를 너무 오랫만에 풀어서 삼중 반복문의 순서를 헷갈렸습니다.

K I J인데 I J K 로 잘 못 시도해 시간을 오래 소요했습니다.


5. 코드

더보기
import java.util.*;

//다익스트라로 무지, 어치피 두 경우 A=>B까지 최단 루트 검색
//시작점 => 함께 갈 수 있는 지점의 비용은 한번, 그 외는 각각 ADD

//해결법
//1. 시작 지점 => 도착 지점까지 다익스트라로 최단 비용 구하기
//2. 시작 지점들을 제외하고 그 외 지점에서 
class Solution {
    //n 지점 개수
    //s 출발 지점
    //a A의 도착 지점
    // b B의 도착 지점
    //fares 지점 사이 예상 택시 요금
    public int solution(int n, int s, int a, int b, int[][] fares) {
        
    	//간선값 저장 배열 초기화
        int[][] dijk = new int[n+1][n+1];
        
        //20억으로 전체 초기화
        for(int i = 1; i < n+1;i++){
               Arrays.fill(dijk[i],1000000);
        }
        
        //간선별 가중치를 기록
        for(int i = 0; i < fares.length; i++){
            dijk[fares[i][0]][fares[i][1]] = fares[i][2];
            dijk[fares[i][1]][fares[i][0]] = fares[i][2];
        }
        
        //자기 자신은 0으로 초기화
        for(int i = 1; i < n+1;i++){
               dijk[i][i] = 0;
        }
        
        for(int k = 1; k < n+1; k++){
            for(int i = 1; i < n+1; i++){
                for(int j = 1; j < n+1; j++){
                	//기존 값과 두 값을 이었을 때의 값 중 짧은 것을 저장
                    dijk[i][j] = Math.min(dijk[i][j], dijk[i][k] +dijk[k][j]);
                    
                }
            }
        }
        
        int answer = 2000000000;
        for(int i = 1; i < n+1;i++){
            
            answer = Math.min(answer, dijk[s][i] + dijk[i][a] + dijk[i][b]);
        }
        return answer;
    }
}

'programming > 알고리즘' 카테고리의 다른 글

[codeTree, 자바] 술래 잡기  (1) 2022.10.14
[PG, 자바] 주차요금계산  (2) 2022.09.20
[PG, 자바] 등산코스정하기  (0) 2022.09.20
[PG, 자바] 피로도  (0) 2022.09.06
[PG, 자바]추석 트래픽  (0) 2022.09.06

댓글