[프로그래머스] 72413 합승 택시 요금 - JAVA - Lv.3

2024. 12. 14. 18:15·알고리즘/문제풀이

[프로그래머스] 72413 합승 택시 요금 - JAVA - Lv.3

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제 분석

풀이방법

  • 문제는 S에서 두 사람이 택시 합승을 하여 특정 지점(I)까지 같이 이동 후 각자 A, B로 이동할 때 최소 비용을 구하는 문제이다.
  • 예시에서 살펴볼 때 최소값은 4>1>5까지 합승을 하고 그 뒤로 5>6, 5>3>2 경로로 A와 B 지점으로 가는 방법이 최소이다.
  • 합승하여 갈라지는 지점을 I라 했을 때 최솟값은 S-I, I-A, I-B의 최솟값을 구하면 된다. 다익스트라 방식을 이용하였다.

+

  • 제일 처음은 다익스트라로 S-I, I-A, I-B를 각각 구했는데 효율성 테스트 탈락
  • I-S, I-A, I-B를 구하기 위해 `for( i = 1; i < n; i++){}`로 계산했는데 이것도 효율성 테스트 탈락. 지점이 매우 많을 경우 계산이 많아진다.
  • S, A, B 기준으로 모든 지점까지 거리를 계산해 문제를 풀면 된다.

코드

import java.util.*;

class Solution {

    static List<int[]>[] graph;
    static int N;
    static int INF = (int) 10e9;

    public int solution(int n, int s, int a, int b, int[][] fares) {
        N = n;
        graph = new ArrayList[n + 1];

        for (int i = 1; i <= n; i++) {
            graph[i] = new ArrayList<>();
        }

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

        int answer = INF;

        int[] sDist = dijkstra(s);
        int[] aDist = dijkstra(a);
        int[] bDist = dijkstra(b);
        for (int i = 1; i <= n; i++) {
            if (sDist[i] == INF || aDist[i] == INF || bDist[i] == INF) {
                continue;
            }
            answer = Math.min(answer, sDist[i] + aDist[i] + bDist[i]);
        }
        return answer;
    }

    static public int[] dijkstra(int from) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        int[] dist = new int[N + 1];
        Arrays.fill(dist, INF);
        dist[from] = 0;
        pq.add(new Node(0, from));
        while (!pq.isEmpty()) {
            Node now = pq.poll();

            if (dist[now.getNow()] != 0 && dist[now.getNow()] != INF) {
                continue;
            }
            dist[now.getNow()] = now.getDist();

            for (int[] nextNode : graph[now.getNow()]) {
                if (dist[nextNode[0]] == INF) {
                    pq.add(new Node(now.getDist() + nextNode[1], nextNode[0]));
                }
            }
        }
        return dist;
    }
}

class Node implements Comparable<Node> {
    private int dist;
    private int now;

    public Node(int dist, int to) {
        this.dist = dist;
        this.now = to;
    }

    public int getDist() {
        return this.dist;
    }

    public int getNow() {
        return this.now;
    }

    @Override
    public int compareTo(Node node) {
        return this.dist - node.getDist();
    }
}

결과

728x90
저작자표시 비영리 변경금지 (새창열림)
'알고리즘/문제풀이' 카테고리의 다른 글
  • [프로그래머스] 159993 미로 탈출 - JAVA - Lv.2
  • [프로그래머스] 1844 게임 맵 최단거리 - JAVA - Lv.2
  • [백준/BOJ] 9328 열쇠 - JAVA
  • [백준/BOJ] 11053 가장 긴 증가하는 부분 수열 - JAVA
LIRI
LIRI
  • LIRI
    기록
    LIRI
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • 바이브코딩 (1)
      • React (3)
      • CS (0)
      • 알고리즘 (57)
        • 개념 (2)
        • 문제풀이 (54)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    springboot
    비트마스킹
    싸피
    Security
    pccp모의고사
    프로그래머스
    lv3
    ssafy 합격 후기
    백준
    Springsecurity
    JWT
    LV2
    최장증가부분수열
    Spring
    BOJ
    dp
    리액트
    바이브코딩
    BFS
    Java
    알고리즘
    dfs
    SSAFY
    느좋코딩
    커서ai
    LIS
    알고리즘 문제풀이
    그리디
    너비우선탐색
    SSAFY 9기
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
LIRI
[프로그래머스] 72413 합승 택시 요금 - JAVA - Lv.3
상단으로

티스토리툴바