한 걸음씩
[프로그래머스][JS] 최댓값 만들기 (2) 본문
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이 될 수 있도록 코드를 짰다
'Programmers' 카테고리의 다른 글
[프로그래머스][JS] 제일 작은 수 제거하기 (1) | 2023.04.07 |
---|---|
[프로그래머스][JS] 정수 제곱근 판별 (0) | 2023.04.07 |
[프로그래머스][JS] 주사위의 개수 (0) | 2023.04.07 |
[프로그래머스][JS] 제곱수 판별하기 (0) | 2023.04.07 |
[프로그래머스][JS] x만큼 간격이 있는 n개의 숫자 (0) | 2023.04.06 |