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

JavaScript로 배열에서 짝이 없는 숫자 찾기: 양수·음수 대응이 없는 유일한 값 구하기

문제 소개

정수로 이루어진 배열을 입력받는 JavaScript 함수를 작성해야 합니다. 이 배열에는 각 숫자마다 부호만 반대인 짝, 즉 절댓값이 같고 양수 또는 음수 형태인 숫자가 함께 존재하지만, 단 하나의 숫자만은 그 짝이 배열 안에 없습니다.

우리가 만들 함수는 바로 이 짝이 없는 숫자를 찾아 반환해야 합니다.

해결 아이디어

핵심은 reduce() 메서드를 활용하는 것입니다. 배열의 모든 요소를 더하면 짝을 이루는 숫자들은 서로 상쇄되어 0이 되고, 결국 마지막에 남는 값은 짝이 없는 숫자 하나뿐입니다. 동시에 양수와 음수의 개수 차이를 추적하면, 그 절댓값을 나눗셈에 활용해 부호 문제까지 깔끔하게 처리할 수 있습니다.

예제 코드

const arr = [1, -1, 2, -2, 3];
const findOddNumber = (arr = []) => {
    let count = 0;
    let number = arr.reduce((total, num) => {
        if (num >= 0)
            count++
        else
            count--
        return total + num;
    }, 0)
    return number / Math.abs(count);
};
console.log(findOddNumber(arr));

출력 결과

3

동작 원리 자세히 살펴보기

위 코드가 어떻게 작동하는지 단계별로 살펴보겠습니다.

  • 합계 계산: reduce()가 배열 전체의 합을 구합니다. [1, -1, 2, -2, 3]의 경우 1과 -1, 2와 -2가 서로 상쇄되므로 최종 합은 3이 됩니다.
  • 개수 차이 추적: 양수(또는 0)가 나오면 count를 증가시키고, 음수가 나오면 감소시킵니다. 짝을 이루는 수들은 개수 차이에도 영향을 주지 않으므로, 최종적으로 count는 1 또는 -1이 됩니다.
  • 결과 도출: 합계를 count의 절댓값으로 나누면 짝이 없는 숫자가 그대로 반환됩니다. 이 과정 덕분에 짝이 없는 수가 음수인 경우에도 올바른 부호가 유지됩니다.

이 방식의 시간 복잡도는 O(n)으로, 배열을 한 번만 순회하면 되기 때문에 매우 효율적입니다. 추가적인 자료구조나 정렬 없이도 선형 시간 안에 답을 구할 수 있다는 점이 큰 장점입니다.