정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.
- 0 ≤ numbers의 원소 ≤ 10,000
- 2 ≤ numbers의 길이 ≤ 100
function solution(numbers) {
const MAX = Math.max(...numbers);
const idxMAX = numbers.indexOf(MAX);
const beforeARY = numbers.slice(0, idxMAX);
const afterARY = numbers.slice(idxMAX + 1);
const finalARY = beforeARY.concat(afterARY);
const sndMAX = Math.max(...finalARY);
const answer = MAX * sndMAX;
return answer;
}
// 첫 번째 최댓값과 두 번째 최댓값을 곱한 결과를 출력할 배열
const NUM = [1, 2, 5, 5, 3, 4];
// 배열에서 최댓값 찾기
const MAX = Math.max(...NUM);
console.log(MAX); // 5
// 배열에서 최댓값의 index 넘버 찾기
const idxMAX = NUM.indexOf(MAX);
console.log(idxMAX); // 2(동일값이 있다면 첫 번째 값을 기준으로 인덱스 넘버가 출력)
// 최댓값의 index 넘버를 기준으로 배열 나누기
const beforeARY = NUM.slice(0, idxMAX); // NUM[0]부터 NUM[idxMAX]전까지
const afterARY = NUM.slice(idxMAX + 1); // NUM[idxMAX +1]부터
console.log(beforeARY); // [1, 2]
console.log(afterARY); // [5, 3, 4];
// 나눈 배열 합치기
const finalARY = beforeARY.concat(afterARY);
console.log(finalARY); // [1, 2, 5, 3, 4]
// 합친 배열에서 최댓값 찾기
const sndMAX = Math.max(...finalARY);
console.log(sndMAX); // 5
// 구한 모든 최댓값의 곱
const answer = MAX * sndMAX;
console.log(answer); // 25
- 입력값으로 받은 0개 이상의 숫자 중 가장 큰 숫자를 반환
Math.max(값0, 값1, ... , 값N)
- ⚠️ 이때 값은 숫자
- 예제 ⬇️
console.log(Math.max(1, 3, 2)); // 3
- 배열이나 문자열과 같이 반복 가능한 문자를 0개 이상의 인수 (함수로 호출할 경우) 또는 요소 (배열 리터럴의 경우)로 확장하여, 0개 이상의 키-값의 쌍으로 객체로 확장
(...)
- 배열에서 최댓값 찾는 예제 ⬇️
const numbers = [1, 2, 3]; console.log(Math.max(...numbers)); // 3
- 주어진 this 값과 배열 (또는 유사 배열 객체) 로 제공되는 arguments 로 함수를 호출
func.apply(thisArg, [argsArray]);
- 예제 ⬇️
const numbers = [1, 2, 3]; console.log(Math.max.apply(null, numbers)); //3
- 두 개 이상의 배열을 병합
- 기존 배열을 변경하지 않고, 새 배열을 반환
- 예제 ⬇️
const beforeARY = [1, 2]; const afterARY = [5, 3, 4]; const finalARY = beforeARY.concat(afterARY) console.log(finalARY); // [1, 2, 5, 3, 4]
const letters = ['a', 'b', 'c']; const num1 = [1, 2, 3]; const num2 = [4, 5, 6]; const ary = letters.concat(num1, num2); console.log(ary); // ['a', 'b', 'c', 1, 2, 3, 4, 5, 6]
- 예제 ⬇️
const array = ['a', 'b']; const elements = [0, 1, 2]; array.push.apply(array, elements); console.log(array); // ['a', 'b', 0, 1, 2]
// 1
function solution(numbers){
numbers.sort((a, b) => b - a); // 내림차순
return numbers[0] * numbers[1];
}
// 2
fuction solution(numbers){
let [a, b] = numbers.sort((a, b) => b - a); // 내림차순
return a * b;
}
- 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환
- 기본 정렬(매개변수 생략 시) 순서 ➡️ 문자열의 유니코드 코드 포인트
- 예제 ⬇️
const array1 = [1, 30, 4, 21, 100000]; console.log(array1.sort()); // [1, 100000, 21, 30, 4]
⭐매개변수
compareFunction(a, b)
- 정렬 순서를 정의하는 함수
- 반환 값 < 0 ➡️ a가 b보다 앞
- 반환 값 = 0 ➡️ a와 b 순서 그대로
- 반환 값 > 0 ➡️ a가 b보다 뒤
⭐정렬(차순)
- 오름차순
value.sort((previous, current) => previous - current);
- 내림차순
value.sort((previous, current) => current - previous);
⭐알고리즘
const NUM = [1, 2, 5, 5, 3, 4]; console.log(NUM); // [1, 2, 5, 5, 3, 4]; NUM.sort((a, b) => { console.log(`a: ${a}, b: ${b}`); // a는 배열 두 번째 값(previous), b는 배열 첫 번째 값(current) return b - a; // a: 2, b: 1 ➡️ return 값(-1) 음수 => a가 b보다 앞 [2(a), 1(b), 5, 5, 3, 4] // a: 5, b: 2 ➡️ return 값(-3) 음수 => a가 b보다 앞 [5(a), 2(b), 1, 5, 3, 4] // a: 5, b: 5 ➡️ return 값(0) 0 => a와 b 순서 그대로 [5(a), 2, 1, 5(b), 3, 4] // a: 5, b: 2 ➡️ return 값(-3) 음수 => a가 b보다 앞 [5, 5(a), 2(b), 1, 3, 4] // a: 5, b: 5 ➡️ return 값(0) 0 => a와 b 순서 그대로 [5(a), 5(b), 2, 1, 3, 4] // a: 3, b: 2 ➡️ return 값(-1) 음수 => a가 b보다 앞 [5, 5, 3(a), 2(b), 1, 4] // a: 3, b: 5 ➡️ return 값(2) 양수 => a가 b보다 뒤 [5, 5(b), 3(a), 2, 1, 4] // a: 4, b: 3 ➡️ return 값(-1) 음수 => a가 b보다 앞 [5, 5, 4(a), 3(b), 2, 1] // a: 4, b: 5 ➡️ return 값(1) 양수 => a가 b보다 뒤 [5, 5(b), 4(a), 3, 2, 1] }); console.log(`sorted NUM: ${NUM}`); // sorted NUM: 5,5,4,3,2,1
맨 처음 생각한 방법은 배열에서 가장 큰 최댓값을 구하면 그 값을 배열에서 삭제한 후 배열에서 두 번째 최댓값을 구하는 것이었다. 그런데 배열에서 특정값을 삭제하는 코드가 생각외로 복잡하여 다른 방법을 구상했다. 그 방법이 바로 prototype.slice()
다. 가장 큰 최댓값을 기준으로 왼쪽에 있는 원소들 따로, 오른쪽에 있는 원소들 따로 각 배열을 만들어 총 2개의 배열을 만들고 이 배열들을 병합(prototype.concat()
)하여 하나의 배열을 만들어 이 배열에서 최댓값을 찾는 것이다. 이때 조심해야 할 것이 첫 번째 최댓값의 인덱스 넘버를 구하지 않고 const beforeARY = numbers.slice(0, idxMAX);
로 작성해버리면 최댓값 기준이 아닌 최대값인 인덱스 넘버의 원소를 기준으로 나뉘게 된다. 그러니까 최댓값이 5이기 때문에 인덱스 넘버가 5인 원소 4를 기준으로 배열이 나뉘게 된다. 처음에는 이걸 미쳐 생각하지 못하고 잘못된 방법으로 코드를 작성했더니 내가 원하는 결과값이 안 나왔다. 그래도 다른 사람 도움 없이 내 스스로 해결해서 정말 뿌듯했다.
참고 사이트
MDN, array.sort() 동작원리 파악