React

10 배열 파티션 I

n개의 페어를 이용한 min(a, b)의 합으로 만들 수 있는 가장 큰 수를 출력하라

My solution

페어를 어떻게 구성해야 가장 큰 수를 만들 수 있는지 고민해야 한다.
[1,4,3,2]가 주어지면 합이 커지기 위해서는 각 min이 3,4를 리턴해주어야 최종적으로 가장 큰 수인 7을 만들 수 있다.
하지만 min함수는 최솟값을 구하는 함수이기 때문에 4를 리턴할 수가 없다. 하지만 3은 가능하다.
즉, 실질적인 최댓값을 리턴해줄 순 없어도 최댓값 바로 아래에 있는 값을 리턴하기 위해 최댓값을 사용할 수는 있다.
나머지 1,2는 1을 리턴하게 되어 있다.
위 로직은 결국 최댓값순으로 배열을 내림차순으로 정렬한 뒤
0번 인덱스, 1번 인덱스 비교,
2번 인덱스, 3번 인덱스 비교
이렇게 2개의 쌍으로 비교해나가면 구할 수 있을 것 같다. 마지막은 쌍이 안 맞을 수 있어서 nullish coalescing operator로 0을 주었다.

Code

const arrayPartition1 = function (array) { array.sort((a, b) => b - a); let answer = 0; for (let i = 0; i < array.length; i += 2) { answer += Math.min(array[i], array[i + 1] ?? 0); } return answer; };
JavaScript
복사

Solution

1. 오름차순 풀이

내 풀이 방식과 동일하다.

2. 짝수 번째 값 계산

min값을 일일이 구하지 않고 짝수번째를 더한다. 여기에 항상 작은 값이 오기 때문이다.
이렇게 구현하기 위해 내림차순이 아니라 오름차순으로 바꾼다.
const arrayPartition1 = function (array) { array.sort((a, b) => a - b); let answer = 0; for (let i = 0; i < array.length; i++) { if (i % 2 === 0) { answer += array[i]; } } return answer; };
JavaScript
복사

3. 파이썬다운 방식

슬라이싱으로 한줄에 푸는 풀이이다. sum(sorted(nums)[::-2])로 한다.
js로 배열고차함수를 이용해 풀어도 성능향상이 있었다. 0.18s >>> 0.156s
const arrayPartition1 = function (array) { return array .sort((a, b) => a - b) .filter((_, i) => i % 2 === 0) .reduce((a, b) => a + b, 0); };
JavaScript
복사