Leetcode Java Two City Scheduling
업데이트:
문제
코드
class Solution {
public int twoCitySchedCost(int[][] costs) {
int length = costs.length / 2;
int[] dp = new int[length * 2];
int result = 0;
int index = 0;
for (int[] cost : costs) {
dp[index++] = cost[1] - cost[0];
result += cost[0];
}
Arrays.sort(dp);
for (int i = 0; i < length; i++) {
result += dp[i];
}
return result;
}
}
결과
설명
- 아래를 만족하는 costs에 해당하는 2n명의 직원들을 각 도시에 n명씩 도착하기 위한 최소 비용을 구하는 문제이다.
- costs[i] = [aCosti, bCosti] 를 만족할 때, 각 값은 아래를 의미한다.
- aCosti는 i번째 직원이 a 도시로 이동하기 위한 비용을 나타낸다.
- bCosti는 i번째 직원이 b 도시로 이동하기 위한 비용을 나타낸다.
- costs[i] = [aCosti, bCosti] 를 만족할 때, 각 값은 아래를 의미한다.
- 문제 풀이에 필요한 변수를 정의한다.
- length는 각 도시에 도착하기 위한 인원들을 저장할 변수로, costs의 길이를 2로 나눈 값을 저장한다.
- dp는 최소 비용을 계산하기 위한 배열로, $length \times 2$ 크기의 정수 배열로 초기화한다.
- result는 최소 비용을 저장할 변수로, 0으로 초기화한다.
- index는 dp의 위치 값을 저장할 변수로, 0으로 초기화한다.
- costs의 모든 값을 순차적으로 cost에 넣고 아래를 수행한다.
- dp[index]의 위치에 $cost[1] - cost[0]$인 b 도시로 이동하는 비용과 a 도시로 이동하는 비용의 차이를 저장하고 index를 증가시켜준다.
- result에 a 도시로 이동하는 비용인 cost[0]을 더해준다.
-
dp를 오름차순으로 저장하여 b 도시로 이동하는 비용이 비교적 낮은 오름차순으로 정렬해준다.
- 정렬된 dp의 앞의 절반 값을 result에 더해주면서 b도시로 이동하기 위한 기회비용을 계산하여 주어진 문제의 결과로 반환한다.
해설
- a 도시로 가는 비용을 모두 더한 후, dp에는 a 도시로 가는 비용에서 b 도시로 가는 비용을 뺀 b 도시로 가기 위한 기회(환불)비용이 큰 순서대로 넣어준다.
- a 도시로 가는 비용을 저장한 result에서 위의 dp 내 기회(환불)비용이 가장 큰 절반 값을 더하면 최소 비용을 구할 수 있다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기