스터디/코딩테스트

javascript 코딩테스트 - 최댓값 만들기

공대생철이 2023. 2. 28. 16:06
728x90

문제 설명

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.


제한사항
  • -10,000 ≤ numbers의 원소 ≤ 10,000
  • 2 ≤ numbers 의 길이 ≤ 100

입출력 예numbersresult
[1, 2, -3, 4, -5] 15
[0, -31, 24, 10, 1, 9] 240
[10, 20, 30, 5, 5, 20, 5] 600

 

처음 든 생각

- 모든 곱셈을 다 수행해야될까..? 근데 그거밖에 안 떠오르네. 반복문 두 번 돌려야겠다.

- 그리고 그 중에서 젤 큰 놈만 빼야지

 

나의 답

function solution(numbers) {
    let tmp;
    const arr = [];
    for(let i=0; i<numbers.length;i++){
        for(let j=0; j<numbers.length;j++){
            if(i!==j){
                tmp = numbers[i]*numbers[j]
                arr.push(tmp)
            }
        }
    }
    return Math.max(...arr);
}

tmp 라는 애를 반복문 밖에서 선언을 하였다. 사실 이거의 스코프는 그다지 상관 없는 듯

그리고 반복문을 중첩으로 돌려서 모든 곱셈 연산의 값을 배열에 넣어주고 그 중 최대인 애를 리턴하도록 했다.

 

참고

function solution(numbers) {
    numbers.sort((a, b) => a - b);
    return Math.max(numbers[0]*numbers[1], numbers[numbers.length-1]*numbers[numbers.length-2]);
}

다른 사람의 풀이를 보다가 신박한 풀이가 있었다.

 

numbers를 오름차순으로 배열한 후에 가장 앞의 두개의 원소의 곱과 가장 끝에 두개의 원소의 곱을 비교한 것이다.

numbers 안에 음수나 양수만 있다면 너무나도 쉽게 이해가 된다.

하지만 부호가 다른 게 섞여있어도 상관이 없다.

 

음수 1개 양수 1개면 당연히 최댓값은 음수가 나올테니 노상관

음수 2개 양수 1개면 음수 2개 곱해져야 양수가 나오니깐 노상관

음수 1개 양수 2개면 양수 2개 곱해지는 최댓값

음수 2개 양수 2개면 음수끼리 곱해진거나 양수끼리 곱해진 것끼리만 비교하면 끝

 

부호가 일치해야 최댓값이 나올 수 있다는 발상이였고 각각 2개 이하로 있어도 전혀 상관이 없었다.

 

728x90