Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 배열 속 유일하게 다른 요소 찾기

모든 요소가 동일한 값을 가지고 있지만 단 하나의 요소만 값이 다른 배열이 주어졌을 때, 그 유일하게 다른 값을 찾아 반환하는 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

두 방법 모두 시간 복잡도 면에서 충분히 효율적이며, 상황에 따라 가독성이 좋은 방식을 선택해 사용하면 됩니다.