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
복사