문제 소개
숫자들을 담고 있는 배열이 있을 때, 배열의 모든 값을 0부터 100 사이의 상대적인 값으로 변환하는 함수를 작성해야 한다고 가정해 보겠습니다. 즉, 가장 큰 숫자는 100으로, 가장 작은 숫자는 0으로 변환되며, 나머지 값들은 비율에 따라 0과 100 사이의 적절한 값으로 매핑됩니다.
이러한 정규화(Normalization) 작업은 데이터 시각화, 점수 환산, 차트 스케일 조정 등 다양한 상황에서 유용하게 활용됩니다.
구현 코드
다음은 이를 구현한 코드입니다 −
const numbers = [45.71, 49.53, 18.5, 8.38, 38.43, 28.44];
const mapNumbers = (arr) => {
const max = Math.max(...arr);
const min = Math.min(...arr);
const diff = max - min;
return arr.reduce((acc, val) => acc.concat((100/diff)*(val-min)), []);
};
console.log(mapNumbers(numbers));
코드 동작 원리
위 코드의 핵심 로직은 다음과 같습니다.
- Math.max(...arr) : 스프레드 연산자를 사용하여 배열에서 최댓값을 구합니다.
- Math.min(...arr) : 같은 방식으로 배열에서 최솟값을 구합니다.
- diff : 최댓값과 최솟값의 차이, 즉 데이터의 전체 범위를 계산합니다.
- (100/diff)*(val-min) : 각 값에서 최솟값을 뺀 뒤 전체 범위에 대한 비율을 구하고, 여기에 100을 곱해 0~100 사이의 값으로 변환합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
[
90.71688942891859,
100,
24.59295261239368,
0,
73.02551640340218,
48.74848116646417
]
결과를 살펴보면 가장 큰 값인 49.53은 100으로, 가장 작은 값인 8.38은 0으로 변환된 것을 확인할 수 있습니다. 나머지 값들 역시 각자의 비율에 맞춰 0과 100 사이의 값으로 정확하게 매핑되었습니다.