알고리즘
[프로그래머스] 최솟값 만들기
jimyu
2024. 3. 6. 15:03
Lv.2
자연수가 들어있는 두 배열에서 요소 하나씩 꺼내 곱한 것의 최소 누적합을 반환.
따라서 두 배열을 내림차 혹은 오름차순으로 정렬하고 최소 곱들을 구해 더해주면 된다.
개인적으로 JS 배열 메서드와 특징을 까먹어서 헤맸던 문제..
내 풀이
- JS에서는 배열 인덱스에 [-1]이 지원되지 않는다! 파이썬이랑 헷갈리지 말자!!😂
- pop()은 특정 인덱스를 매개변수로 받지 않고 오직 배열의 마지막 요소만 제거하고 나머지를 반환한다.
- shift()도 오직 배열의 첫 요소만 제거하고 나머지 반환!
- 특정 요소를 삭제하고 싶다면, splice()나 slice()를 사용하자.
function solution(A, B) {
let answer = 0;
A.sort((a, b) => b - a);
B.sort((a, b) => b - a);
let length = A.length;
for (i = 0; i < length; i++) {
let min = Math.min(A[0] * B[A.length - 1], B[0] * A[A.length - 1]);
if (min === A[0] * B[A.length - 1]) {
A.shift();
B.pop();
} else {
B.shift();
A.pop();
}
answer += min;
}
return answer;
}
다른 풀이
- reduce 메서드를 완전 잊어버렸는데 복습 차원에서 정리했다! 정리글
- 나의 풀이는 모든 경우를 비교해서 답을 구하기 때문에 조건문이 추가되었고 복잡해졌는데, 다른 분들은 그냥 A의 최소 * B의 최대로 구하는 것 같아서 찾아보니 이 문제는 그리디로 풀이가 가능하다고 했다. 그리디로 해결 가능한지 판단하는 능력이 필요할 것 같다.
그리디인지 파악하는 방법
function solution(A,B){
A.sort((a, b) => a - b)
B.sort((a, b) => b - a)
return A.reduce((total, val, idx) => total + val * B[idx], 0)
}