-
leetcode_Two City SchedulingProgramming/CS 2019. 11. 16. 02:18
오늘은 leetcode의 Two City Scheduling을 풀어보았다.
There are 2N people a company is planning to interview. The cost of flying the i-th person to city A is costs[i][0], and the cost of flying the i-th person to city B is costs[i][1].
Return the minimum cost to fly every person to a city such that exactly N people arrive in each city
input : [[10,20],[30,200],[400,50],[30,20]]
outpupt : 110인터뷰를 위해 회사로 가야하는 사람이 2N명 있다.
i번째 사람이,
A 도시로 가는 비용은 costs[i][0] 이고
B 도시로 가는 비용은 costs[i][1] 이다.
두 도시에 각 N명씩, 모든 사람이 도시에 도착해야하고, 그때 발생하는 최소 비용을 구하라.
고려해야하는 부분은 이렇게 정리할 수 있다.
1. A와 B 도시 각각 N명씩 도착해야 한다.
2. 발생하는 비용을 최소화 해야 한다.
만약 모든 사람이 도착하기 전에,
이미 A 도시에 도착한 사람이 N명으로 꽉 찬 경우,
남은 사람들은 A 도시로 향하는 비용이 더 적다고 할지라도,
A 도시에 이미 N명의 사람이 도착했기 때문에 나머지는 B 도시로 이동해야한다!
A 도시
B 도시
10
30
20
40
3050
4060
2명
2명
2번째 사람까지는 최소비용을 따져서 비용이 적게 드는 쪽(A 도시)으로 이동했다.
3번째 사람 역시 A 도시로 가는 비용이 더 적지만
이미 A 도시에는 모든 인원( 2N )의 절반( N )인 2명의 사람이 이동해 있는 상태이기 때문에, B 도시로 이동해야한다.
여기서 생각해 볼 수 있는 것은,
점점 뒤로 갈수록 최소비용이 아닌 선택을 할 가능성이 커진다는 점.
최대의 이익을 볼 수 있는 선택을 해야되기 때문에,
기왕이면 비록 최소비용이 아닌 선택을 하더라도 그에 대한 타격이 상대적으로 적은 선택을 하는 것이 좋겠다.
이것이 무슨 말인가 하면, 아래 표를 살펴보자.
**input = [[10,20], [30,50], [40,70], [50,100]]
A 도시 B 도시 A 도시 B 도시 10 20 50 100 30 50 40 70 40 70 30 50 50 100 10 20 총 비용 10+30+70+100
= 210
총 비용 50+40+50+20
160
두 케이스는 모두 input 값으로 같은 데이터를 받았지만, 총 비용을 확인해보면 큰 차이가 있다.
왼쪽은 받은 input 값을 그대로 사용했고, 오른쪽은 input 값을 어떠한 기준으로 정렬한 뒤 사용했기 때문이다.
오른쪽의 경우 A와 B 비용의 차이의 절대값( | a - b | )을 기준으로 내림차순 정렬을 했다.
이렇게 되면
각 도시에 N명이 배정되기 전까지는 최소비용으로 최선의 선택을 할 수 있고,
최소비용을 선택할 수 없더라도, 두 비용의 차이가 적은, 상대적으로 손실이 적은 선택을 할 수 있게 된다.
+ Array custom sort
array.sort( compareFunction );
compareFunction(a, b) < 0 의 경우, a가 먼저 (a의 색인이 b보다 낮다.)
compareFunction(a, b) > 0 의 경우, b가 먼저 (b의 색인이 a보다 낮다.)
compareFunction(a, b) = 0 의 경우, 그대로 (변경없음)
costs.sort( function (a,b) { //[A city , B city] //a : [10, 20] //b : [40, 70] return Math.abs((b[0]-b[1]))-Math.abs((a[0]-a[1])); // (| 40 - 70 |) - (| 10 - 20|) }); //각 도시의 비용 차이를 절대값으로 바꾸어 내림차순으로 정렬
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
Array.prototype.sort()
sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 정렬은 stable sort가 아닐 수 있습니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다.
developer.mozilla.org
'Programming > CS' 카테고리의 다른 글
TIL_setTimeout() (0) 2019.11.29