알고리즘/프로그래머스
[C++] 프로그래머스 택배 배달과 수거하기
이영재의오른발
2023. 1. 9. 14:54
반응형
최소 이동거리를 구하는 것이 문제이기 때문에 그리디, BFS, DFS 정도를 생각해 볼 수 있다.
각 집들이 일렬로 연결되어 있고 모든 거리가 1이기 때문에 그리디 알고리즘을 사용해야한다.
그렇다면 어떤 방식으로 그리디 알고리즘을 사용해야할까??
** 배달과 수거를 나눠야한다 **
배달 거리를 최소화 하는 방법
1. 가장 먼 집을 한번만 탐색하는 방식으로 이동해야 한다.
2. 가장 먼 집을 한번만 탐색하면서 물류창고에서 최대양의 택배를 가져와 최대한 많은 집에 택배를 배달해야한다.
위 두가지 조건을 따르려면 물류창고에서 최대 개수의 택배를 가져온 뒤 맨 뒷집부터 차례대로 배달하는것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int truck_start = cap; int truck_end = 0; for(int i=dis; i>=0; i--) { if(deliveries[i] > truck_start) { deliveries[i] = deliveries[i] - truck_start; truck_start = 0; } else { truck_start -= deliveries[i]; deliveries[i] = 0; } if(truck_start == 0) {break;} } | cs |
수거 거리를 최소화 하는 방법
1. 가장 먼 집을 한번만 탐색하는 방식으로 이동해야 한다.
2. 가장 먼 집을 한번만 탐색하면서 가장 먼 집에서부터 가져올 수 있는 최대의 수거 박스를 가져와야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | for(int i=dis; i>=0; i--) { int store = cap - truck_end; if(store > pickups[i]) { truck_end += pickups[i]; pickups[i] = 0; } else { pickups[i] = pickups[i] - store; truck_end = cap; } if(truck_end == cap) {break;} } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #include <string> #include <vector> #include <iostream> using namespace std; // 트럭을 두개로 생각해보자 long long solution(int cap, int n, vector<int> deliveries, vector<int> pickups) { long long answer = -1; long long result = 0; // 현재 위치 int dis = deliveries.size()-1; while(dis != -1) { int truck_start = cap; int truck_end = 0; for(int i=dis; i>=0; i--) { if(deliveries[i] > truck_start) { deliveries[i] = deliveries[i] - truck_start; truck_start = 0; } else { truck_start -= deliveries[i]; deliveries[i] = 0; } if(truck_start == 0) {break;} } for(int i=dis; i>=0; i--) { int store = cap - truck_end; if(store > pickups[i]) { truck_end += pickups[i]; pickups[i] = 0; } else { pickups[i] = pickups[i] - store; truck_end = cap; } if(truck_end == cap) {break;} } if(!(truck_start == cap && truck_end == 0)) { result = result + (dis+1) * 2; } for(int i=dis; i>=0; i--) { if(deliveries[i] == 0 && pickups[i] == 0) { dis--; } else { break; } } } answer = result; return answer; } | cs |
728x90
반응형