-
프로그래머스 - 배달 [C++]문제 풀이/프로그래머스 2024. 1. 8. 20:56반응형
이 문제는 최단 경로 알고리즘을 사용해서 풀었다.
집의 개수가 최대 50개이고, 1번 집부터 모든 각 집까지의 비용이 K 이하인 모든 집을 찾는 문제이다.
플로이드 워셜 알고리즘은 O(N^3) 이므로, 50^3 = 125,000 이므로 1초 내에 충분히 풀 수 있다.
한 가지 유의할 점은 같은 집 쌍에 대해 여러 도로가 존재할 수 있다는 것이다. 이 경우 여러 도로 중 가장 cost가 작은 도로를 해당 집 쌍의 비용으로 정하면 쉽게 풀 수 있다.
#include <iostream> #include <vector> #include <algorithm> using namespace std; #define HOUSE_MAX 50 #define INF 1000000000 int dist[HOUSE_MAX + 1][HOUSE_MAX + 1]; void floydWarshall(int N) { for (int k = 1; k <= N; k++) { for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (dist[i][j] >= dist[i][k] + dist[k][j]) { dist[i][j] = dist[i][k] + dist[k][j]; } } } } } void init(int N) { for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (i == j) { dist[i][j] = 0; continue; } dist[i][j] = INF; } } } int solution(int N, vector<vector<int> > road, int K) { int answer = 0; init(N); for (vector<int> info : road) { int src = info[0]; int dst = info[1]; int cost = info[2]; int resultCost = min(dist[src][dst], cost); dist[src][dst] = resultCost; dist[dst][src] = resultCost; } floydWarshall(N); for (int i = 1; i <= N; i++) { if (dist[1][i] <= K) { answer++; } } return answer; }
반응형'문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 마법의 엘리베이터 [C++] (0) 2024.01.10 프로그래머스 - 가장 큰 정사각형 찾기 [C++] (0) 2024.01.10 프로그래머스 - 수식 최대화 [C++] (0) 2023.10.16 프로그래머스 - 괄호 변환 [C++] (0) 2023.10.16 프로그래머스 - 파괴되지 않은 건물 [C++] (0) 2023.09.10