알고리즘

[프로그래머스] 최솟값 만들기

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)
}