수학에서 엄격하게 증가하는 함수(strictly increasing function)란 그래프에 표시되는 값이 끊임없이 증가하기만 하는 함수를 의미합니다. 마찬가지로 엄격하게 감소하는 함수(strictly decreasing function)는 값이 계속해서 감소하기만 하는 함수를 말합니다.
이 개념을 배열에 적용해 보겠습니다. 숫자 배열을 인자로 받아, 배열의 요소들이 처음부터 끝까지 한 방향으로만 증가하거나 감소하는 경우 true를 반환하고, 그렇지 않다면 false를 반환하는 자바스크립트 함수를 작성해야 합니다.
예제
다음은 이를 구현한 코드입니다 −
const arr = [12, 45, 6, 4, 23, 23, 21, 1];
const arr2 = [12, 45, 67, 89, 123, 144, 2656, 5657];
const sameSlope = (a, b, c) => (b - a < 0 && c - b < 0) || (b - a > 0 && c - b > 0);
const increasingOrDecreasing = (arr = []) => {
if(arr.length <= 2){
return true;
};
for(let i = 1; i < arr.length - 1; i++){
if(sameSlope(arr[i-1], arr[i], arr[i+1])){
continue;
};
return false;
};
return true;
};
console.log(increasingOrDecreasing(arr));
console.log(increasingOrDecreasing(arr2));
출력
콘솔에 출력되는 결과는 다음과 같습니다 −
false
true
코드 동작 원리
핵심 역할을 하는 sameSlope 함수는 연속된 세 요소 a, b, c를 받아 b - a와 c - b의 부호가 서로 같은지 확인합니다. 두 차이가 모두 양수라면 증가 추세, 모두 음수라면 감소 추세에 해당합니다.
increasingOrDecreasing 함수는 배열의 길이가 2 이하일 경우 비교 대상이 없으므로 항상 조건을 만족한다고 보고 true를 반환합니다. 그 외에는 배열을 순회하며 모든 인접 요소 쌍의 기울기 부호가 일관되게 유지되는지 검사하고, 중간에 한 번이라도 증가와 감소가 뒤섞이면 즉시 false를 반환합니다.
첫 번째 배열 arr은 45에서 6으로 값이 급감했다가 다시 상승하는 구간이 있어 단조성이 깨지므로 false가 출력됩니다. 반면 두 번째 배열 arr2는 처음부터 끝까지 계속 증가만 하기 때문에 true가 출력됩니다.