한 걸음씩

[프로그래머스][JS] 최댓값 만들기 (2) 본문

Programmers

[프로그래머스][JS] 최댓값 만들기 (2)

winter17 2023. 4. 7. 18:10

https://school.programmers.co.kr/learn/courses/30/lessons/120862

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 과정

function solution(numbers) {
    // 완전탐색
    let max = 0
    numbers.sort((a, b)=> (a - b))
    if ((numbers[0] * numbers[1]) > (numbers[numbers.length-1] * numbers[numbers.length-2])){
        max = numbers[0] * numbers[1]
    }else{
        max = numbers[numbers.length-1] * numbers[numbers.length-2]
    }
    return max
}

[Tip] 완전 탐색 문제!

numbers 배열을 오름차순 or 내림차순으로 정렬해서

numbers의 0, 1번째 요소를 곱한 값 

numbers의 마지막,  마지막 앞의 요소를 곱한 값을 비교해서 큰 값을 전달하면 된다 

 

→ 이런 방법을 사용할 수 있는 이유가 제한 사항에 -10,000 <= numbers의 원소 <= 10,000 명시되어있고

그 때문에 배열을 오름차순 정렬했을 때 0번째 요소, 1번째 요소가 마이너스일 경우가 존재하는데 둘 다 마이너스이고

두 개의 원소를 곱하면 배열의 최댓값이 될 가능성이 있다


리뷰

// 틀린 코드
function solution(numbers) {
    // 완전탐색
    let max = 0
    for (let i = 0; i < numbers.length; i++){
        // 같은 원소를 두 번 곱하는 경우를 피하기 위해 j = i + 1
        for (let j = i + 1; j < numbers.length; j++){
            const product = numbers[i] * numbers[j]
            if (product > max) {
                max = product
            }
        }
    }
    return max
}

위의 틀린 코드대로 제출하면 테스트 케이스 7번이 통과가 안 됐는데

이유를 모르겠어서 다른 사람 코드를 참고했더니 완전탐색 방법으로 풀지 않고 인덱스로 접근하여 풀었길래

시도해 봤더니 통과가 되었다.

 

[틀린 코드 설명] 근데 진짜 왜 이 코드가 틀렸는지 모르겠다!!

파이썬이라면 range값을 조절하면서 반복문을 돌렸을 텐데

js에서는 for문으로 범위를 어떻게 설정해야 할지 생각을 못했다

첫 번째 반복문에서 i = 0이라면 두 번째 반복문에서는 j = i + 1을 하면 

같은 원소를 두 번 곱하는 경우를 막아준다

 

그리고 max를 따로 구하지 않고 for문안에서 바로바로 구하는데

product라는 변수를 생성해서 두 원소를 곱하고 max = 0 변수를 생성해 product의 수가 더 크다면

max = product이 될 수 있도록 코드를 짰다