본문 바로가기
코딩테스트/프로그래머스

합승 택시 요금 - JAVA

by 의정부핵꿀밤 2022. 8. 1.
728x90

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

 

프로그래머스

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

programmers.co.kr


이 문제는 최단 거리를 찾는 문제이므로 다익스트라 알고리즘을 사용하면 된다!

근데 문제는? 내가 다익스트라 알고리즘을 모른다는거~~

그래서 공부함 ㅎ_ㅎ

 

https://yummy0102.tistory.com/433

 

[알고리즘] 다익스트라 알고리즘

다익스트라 알고리즘 (Dijkstra Algorithm) 간단하게 하나의 정점에서 다른 점들로 가는 최단 경로를 구하고 싶을 때 사용한다 즉, 최단 거리를 구할 때 사용한다! 시작점을 D로 잡고 나머지 점까지의

yummy0102.tistory.com

 

 

아무튼 다익스트라 알고리즘을 통해서 구현하면 되는데, 우선 S, A, B에서부터 모든 노드까지의 최단 거리를 다 구한다

그리고 각 노드별로 s, a, b까지의 최단 거리의 합이 최솟값인 곳을 찾으면 된다!

그니까 다익스트라를 s, a, b마다 한 번씩 총 3번을 호출하면 된다

 

나는 우선순위 큐를 사용해서 다익스트라를 구현하는게 훨씬 시간 효율성이 좋다고 해서 그렇게 구현했다!

 

 

자바 코드)

import java.util.*;

class Edge implements Comparable<Edge> {
    int index;
    int cost;

    Edge(int index, int cost) {
        this.index = index;
        this.cost = cost;
    }

    @Override
    public int compareTo(Edge o) {
        return 0;
    }
}

class Solution {
    static final int INF = 200 * 100000 + 1;
    static List<List<Edge>> graph = new ArrayList<>();

    public int solution(int n, int s, int a, int b, int[][] fares) {
        int answer = INF;

        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }

        for (int[] i : fares) {
            graph.get(i[0]).add(new Edge(i[1], i[2]));
            graph.get(i[1]).add(new Edge(i[0], i[2]));
        }

        int[] startA = new int[n + 1];
        int[] startB = new int[n + 1];
        int[] start = new int[n + 1];

        Arrays.fill(startA, INF);
        Arrays.fill(startB, INF);
        Arrays.fill(start, INF);

        startA = dijkstra(a, startA);
        startB = dijkstra(b, startB);
        start = dijkstra(s, start);

        for(int i=1;i<=n;i++) {
            answer = Math.min(answer, startA[i]+startB[i]+start[i]);
        }
        return answer;
    }

    public int[] dijkstra(int start, int[] costs) {
        PriorityQueue<Edge> pq = new PriorityQueue<>();
        pq.offer(new Edge(start, 0));
        costs[start] = 0;

        while (!pq.isEmpty()) {
            Edge now = pq.poll();
            int nIndex = now.index;
            int nCost = now.cost;

            if (nCost > costs[nIndex]) {
                continue;
            }

            List<Edge> edges = graph.get(nIndex);
            for (Edge e : edges) {
                int cost = e.cost + costs[nIndex];

                if (cost < costs[e.index]) {
                    costs[e.index] = cost;
                    pq.offer(new Edge(e.index, cost));
                }
            }
        }
        return costs;
    }
}

마지막에 제출하기 전에 헷갈렸던 건 문제에서 인덱스를 1부터 사용하기 때문에 n까지 =으로 처리해서 n+1 길이로 만들어서 사용해야 했다

근데 그걸 깜빡하고 반복문을 n 직전까지만 해서 좀 삐끗했당ㅎㅎㅎ

아무튼 다익스트라 제대로 써본건 이 문제가 처음인것 같아서 좋다!

 

 

 

 

 

 


참고)

https://wellbell.tistory.com/m/101

 

728x90

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[스택/큐] 같은 숫자는 싫어 - JAVA  (0) 2022.08.19
외벽점검 - JAVA  (0) 2022.08.17
소수 만들기 - JAVA  (0) 2022.07.23
[완전탐색] 피로도 - JAVA  (0) 2022.07.20
[DFS/BFS] 단어 변환 - JAVA  (0) 2022.07.19

댓글