모든 요소가 동일한 값을 가지고 있지만 단 하나의 요소만 값이 다른 배열이 주어졌을 때, 그 유일하게 다른 값을 찾아 반환하는 JavaScript 함수를 작성해 보겠습니다.
예를 들어 [2, 4, 4, 4, 4]와 같은 배열이 입력으로 주어진다면, 함수는 다른 값인 2를 반환해야 합니다.
예제 코드
이 문제를 해결하는 코드는 다음과 같습니다.
const arr = [2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4];
// 배열의 길이는 최소 3이라고 가정합니다.
const findUnlike = arr => {
for(let i = 1; i < arr.length - 1; i++){
// 현재 요소가 앞뒤 요소와 모두 다른 경우
if(arr[i] !== arr[i-1] && arr[i] !== arr[i+1]){
return arr[i];
}// 앞 요소만 다른 경우
else if(arr[i] !== arr[i-1] && arr[i] === arr[i+1]){
return arr[i-1];
}// 뒤 요소만 다른 경우
else if(arr[i] === arr[i-1] && arr[i] !== arr[i+1]){
return arr[i+1];
}
};
};
console.log(findUnlike(arr));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
2
코드 동작 원리
이 함수는 배열을 순회하면서 인접한 세 개의 요소를 서로 비교하는 방식으로 동작합니다.
- 현재 요소가 앞 요소와도, 뒤 요소와도 다르다면 현재 요소가 바로 찾고자 하는 값입니다.
- 앞 요소만 다르다면 앞 요소가 정답입니다.
- 뒤 요소만 다르다면 뒤 요소가 정답입니다.
세 요소를 한 번에 비교하기 때문에 배열의 시작과 끝 경계에서 발생할 수 있는 오류 없이 안전하게 다른 값을 찾을 수 있습니다.
더 간단한 대안 방법
indexOf()와 lastIndexOf()를 활용하면 훨씬 간결하게 같은 기능을 구현할 수 있습니다. 어떤 요소의 첫 번째 위치와 마지막 위치가 같다면, 그 요소는 배열에 단 하나만 존재한다는 의미이기 때문입니다.
const findUnlike = arr => arr.find(el => arr.indexOf(el) === arr.lastIndexOf(el)); console.log(findUnlike([2, 4, 4, 4, 4])); // 2
두 방법 모두 시간 복잡도 면에서 충분히 효율적이며, 상황에 따라 가독성이 좋은 방식을 선택해 사용하면 됩니다.