[프로그래머스] 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
  • 전체
    오늘
    어제
    • 분류 전체보기 (73)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • React (3)
      • CS (0)
      • 알고리즘 (57)
        • 개념 (2)
        • 문제풀이 (54)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    Springsecurity
    백준
    프로그래머스
    BOJ
    도대체왜
    dp
    비트마스킹
    BFS
    SSAFY
    알고리즘 문제풀이
    dfs
    너비우선탐색
    Security
    lv3
    Spring
    최장증가부분수열
    알고리즘
    리액트
    LV2
    JWT
    골드1
    springboot
    싸피
    SSAFY 9기
    LIS
    pccp모의고사
    Java
    ssafy 합격 후기
    그리디
    불 끄기
  • 최근 댓글

  • 최근 글

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

티스토리툴바