숫자 배열에서 인접한 두 숫자가 오름차순으로 연속되어 등장하지 않는다면(여기서는 오름차순 경우만 고려합니다), 그 배열은 100% 셔플된 상태라고 볼 수 있습니다. 반대로 모든 인접 쌍이 연속된 숫자로 이루어져 있다면 셔플 강도는 0%가 됩니다.
길이가 n인 배열에는 원래 순서를 유지한 상태에서 n-1개의 인접 요소 쌍이 존재합니다.
따라서 우리는 숫자 배열을 입력받아 해당 배열의 셔플 강도를 나타내는 0부터 100 사이의 값을 반환하는 JavaScript 함수를 작성해야 합니다.
동작 원리
이 함수는 배열을 한 번 순회하면서 각 인접 쌍을 검사합니다. 현재 요소가 다음 요소보다 크다면(즉, arr[i] > arr[i+1]인 경우) 해당 쌍은 '잘못된 쌍'으로 간주하고 카운트를 증가시킵니다. 마지막에는 잘못된 쌍의 개수를 전체 쌍의 개수(n-1)로 나누고 100을 곱해 백분율로 변환합니다.
예시
다음은 해당 코드입니다 −
const arr = [4, 23, 1, 23, 35, 78, 4, 45, 7, 34, 7];
// 이 함수는 오름차순 정렬에서 벗어난 정도를 계산합니다
const shuffleIntensity = arr => {
let inCorrectPairs = 0;
if(arr.length <= 1){
return 0;
};
for(let i = 0; i < arr.length - 1; i++){
if(arr[i] - arr[i+1] <= 0){
continue;
};
inCorrectPairs++;
};
return (inCorrectPairs / (arr.length - 1)) * 100;
};
console.log(shuffleIntensity(arr));
출력
콘솔에 출력되는 결과는 다음과 같습니다 −
40
즉, 이 배열은 약 40% 정도 셔플되어 있다는 의미입니다. 위 예제 배열에서 총 10개의 인접 쌍 중 4개가 내림차순 관계(감소하는 쌍)에 있기 때문에 40이라는 값이 반환됩니다.