알고리즘🅰/프로그래머스
[프로그래머스] 최솟값 만들기
개발조각
2022. 4. 16. 21:34
728x90
반응형
이번 문제는 레벨 1 수준의 문제였습니다.
요즘 reduce를 안 써서 사용법을 잊고 있었는데 이번 기회에 다시 알게 되는 문제였던 것 같습니다.
최솟값을 만들기 위해서는 "큰수 * 작은 수"를 하면 작은 수가 나옵니다.
그래서 배열A는 오름차순으로 배열B는 내림차순으로 정렬한 뒤 각 배열의 index가 같은 원소끼리 곱해주고 더해주면 됩니다.
해결방안
function solution(A,B){
let numA = A.sort((a,b)=> a-b);
let numB = B.sort((a,b)=> b-a);
// 버전 1
var answer = 0;
for(let i=0; i<A.length; i++) answer += numA[i]*numB[i];
return answer;
// 버전 2
return numA.reduce((acc, cur, idx)=> acc + cur*numB[idx],0);
}
해결방안 순서
- 배열A는 오름차순, 배열B는 내림차순으로 정렬해주기
- 배열 A, B에서 index가 같은 원소끼리 곱해주고 더해준 값을 return 하기
1단계. 배열A는 오름차순, 배열B는 내림차순으로 정렬해주기
let numA = A.sort((a,b)=> a-b);
let numB = B.sort((a,b)=> b-a);
정렬은 정렬 메서드인 sort()를 사용해주었습니다.
- 오름차순 : Array.sort((a,b)=>a-b);
- 내림차순 : Array.sort((a,b)=>b-a);
여기서 오름차순을 sort(); 이렇게만 쓰면 "제출 후 채점하기"에서 통과를 못합니다.
2단계. 배열 A, B에서 index가 같은 원소끼리 곱해주고 더해준 값을 return 하기
// 버전 1
var answer = 0;
for(let i=0; i<A.length; i++) answer += numA[i]*numB[i];
return answer;
// 버전 2
return numA.reduce((acc, cur, idx)=> acc + cur*numB[idx],0);
여기서는 버전을 2가지를 소개하겠습니다.
버전 1은 정직하게 for문을 사용해서 푼 방식이고요.
버전 2는 reduce() 메서드를 사용해서 푼 방식입니다.
버전 1은 보시면 다들 아실 것 같아서 버전 2만 설명하겠습니다.
reduce()에는 네 개의 인자를 가집니다.
- 누산기 (acc)
- 현재 값 (cur)
- 현재 인덱스 (idx)
- 원본 배열 (src)
이번 문제에서는 누산기(acc), 현재 값(cur), 현재 인덱스(idx) 3가지를 사용했습니다.
acc + cur*numB[idx] -> 누적된 값 + numA[현재 인덱스]*numB[현재 인덱스]
이렇게 됩니다.
여기서 포인트는 초기값을 꼭 설정해주어야 됩니다.
- numA.reduce((acc, cur, idx)=> acc + cur*numB[idx],0); -> 여기서 0이 초기값입니다.
초기값 설정 안 해주면 답이 이상하게 나옵니다.
프로그래머스 최솟값 만들기 해결방안 설명은 여기까지입니다.
728x90
반응형