알고리즘🅰/프로그래머스

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

개발조각 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);
}

 

해결방안 순서

  1. 배열A는 오름차순, 배열B는 내림차순으로 정렬해주기
  2. 배열 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()에는 네 개의 인자를 가집니다.

  1. 누산기 (acc)
  2. 현재 값 (cur)
  3. 현재 인덱스 (idx)
  4. 원본 배열 (src)

이번 문제에서는 누산기(acc), 현재 값(cur), 현재 인덱스(idx) 3가지를 사용했습니다.

acc + cur*numB[idx] -> 누적된 값 + numA[현재 인덱스]*numB[현재 인덱스]

이렇게 됩니다.

 

여기서 포인트는 초기값을 꼭 설정해주어야 됩니다.

  • numA.reduce((acc, cur, idx)=> acc + cur*numB[idx],0); -> 여기서 0이 초기값입니다.

초기값 설정 안 해주면 답이 이상하게 나옵니다.


프로그래머스 최솟값 만들기 해결방안 설명은 여기까지입니다.

728x90
반응형