https://school.programmers.co.kr/learn/courses/30/lessons/150366
Greedy
특별한 알고리즘을 요구하지 않는 문제이다. 단순 구현이지만 그리디하게 접근하면 된다.
그리디인 이유는 가장 먼 위치의 집부터 우선 방문해야 한다.
가장 멀리 갔을 때 최대한의 수로 이동해야 가장 먼 위치를 최소한의 왕복으로 다녀올 수 있다.
하지만, 근처부터 배달과 수거를 시작한다면, 먼 위치로 갈 수록 비효율적인 배달을 해야한다.
따라서 맨 마지막에 위치하는 곳부터 배달과 수거를 진행하면 된다.
번외
최대 또는 최소값을 구하기 위해서 Math.max 또는 min 함수를 주로 이용하는데,
해당 함수는 함수 호출 비용이 너무 크다.
알고리즘 시간 최적화를 위해서라면 삼항연산자 또는 if문을 사용해주자.
class Solution {
public long solution(int cap, int n, int[] deliveries, int[] pickups) {
long answer = 0;
n -= 1;
while (n >= 0) {
if (deliveries[n] + pickups[n] == 0) {
--n;
continue;
}
answer += (n + 1) * 2;
moveTruck(n, cap, deliveries);
moveTruck(n, cap, pickups);
}
return answer;
}
private void moveTruck(int n, int remain, int[] arr) {
while (n >= 0) {
int min = remain > arr[n] ? arr[n] : remain;
//int min = Math.min(remain, arr[n]);
remain -= min;
arr[n] -= min;
if(remain == 0)
break;
--n;
}
}
}