본문 바로가기

Study/알고리즘

[프로그래머스] 12978. 배달 (C++)

 

코딩테스트 연습 - 배달

5 [[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]] 3 4 6 [[1,2,1],[1,3,2],[2,3,2],[3,4,3],[3,5,2],[3,5,3],[5,6,1]] 4 4

programmers.co.kr

문제 설명

1. 각 마을은 양방향으로 연결됨

2. 마을 N까지의 거리가 K 이하면, 배달 가능

3. 마을 1에서 배달을 갈 수 있는 마을의 개수 출력

 

풀이

플로이드 와샬 알고리즘

1. 각 마을간의 거리를 입력받을 때마다 배열에 저장 (양방향으로!!)

1-1. 마을 a와 b 사이의 경로가 2개 이상일 수 있으니, 입력받을 때마다 최솟값으로 갱신

2. 마을 기준으로 반복문 돌면서 최소 거리 갱신

3. 마을 a -> a 비용은 0

4. 마을 1 (배열의 첫번째 행) 과 다른 마을들 사이의 거리 중, K 이하인 거리가 존재하면 answer++

 

코드

#include <iostream>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;

int graph[51][51];
int INF = 10001;

int solution(int N, vector<vector<int> > road, int K) {
    int answer = 0;
    memset(graph, INF, sizeof(graph));
    for(int i=0; i<road.size(); i++) {
        graph[road[i][0]][road[i][1]] = graph[road[i][1]][road[i][0]] = min(graph[road[i][0]][road[i][1]], road[i][2]);
    }
    for(int k=1; k<=N; k++) {
        for(int i=1; i<=N; i++) {
            for(int j=1; j<=N; j++) {
                graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
            }
        }
    }
    for(int i=1; i<=N; i++) graph[i][i] = 0;
    for(int i=1; i<=N; i++) {
        if(graph[1][i] <= K) answer++;
    }
    return answer;
}