문제 개요
다음과 같이 양수, 음수, 0이 섞여 있는 정수 배열이 있다고 가정해 보겠습니다.
const arr = [23, -1, 0, 11, 18];
우리가 작성해야 할 것은 이러한 배열을 첫 번째이자 유일한 인수로 받는 자바스크립트 함수입니다. 함수는 배열 안의 숫자들을 양수, 음수, 0의 세 그룹으로 나누고, 각 그룹이 전체에서 차지하는 비율을 소수 형태로 계산해 반환해야 합니다.
예를 들어 위 배열의 길이는 5이므로, 이 배열에 대한 결과는 다음과 같습니다.
const output = [0.2, 0.2, 0.6];
출력 배열에는 항상 3개의 숫자가 들어가며, 순서대로 음수, 0, 양수 정수의 비율을 나타냅니다. 결과를 검증하는 간단한 방법은 세 값을 모두 더했을 때 1에 가까워지는지 확인하는 것입니다. 합이 1에 가깝다면 로직이 올바르게 동작하고 있을 가능성이 높습니다.
구현 방법
이 문제를 해결하는 코드는 다음과 같습니다.
const arr = [23, -1, 0, 11, 18];
const findRatio = (arr = []) => {
const { length } = arr;
const res = [0, 0, 0];
for(let i = 0; i < arr.length; i++){
const el = arr[i];
const key = el / Math.abs(el || 1);
res[key + 1]++;
};
return res.map(el => el / length);
};
console.log(findRatio(arr));코드 동작 원리
el / Math.abs(el || 1): 요소가 양수면 1, 음수면 -1, 0이면 0을 반환합니다. 여기서el || 1은 요소가 0일 때 0으로 나누는 오류를 방지하기 위한 장치입니다.res[key + 1]++: 계산된 값(-1, 0, 1)에 1을 더해 배열 인덱스(0, 1, 2)로 변환한 뒤, 해당 그룹의 카운트를 하나씩 증가시킵니다.res.map(el => el / length): 마지막으로 각 그룹의 개수를 배열 전체 길이로 나누어 소수 비율로 변환합니다.
실행 결과
코드를 실행하면 콘솔에 다음과 같이 출력됩니다.
[0.2, 0.2, 0.6]