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

JavaScript로 배열의 짝수·홀수 값을 인덱스에 맞게 정렬하는 방법

문제 개요

숫자 배열을 입력받아 처리하는 JavaScript 함수를 작성해야 합니다. 이 함수에 입력으로 주어지는 배열은 다음과 같은 두 가지 특수한 성질을 가집니다.

  • 배열의 길이는 항상 짝수입니다.
  • 배열 안의 짝수 개수와 홀수 개수는 항상 서로 같습니다(즉, 둘 다 배열 길이의 절반과 동일합니다).

함수는 배열의 요소들을 재배치하여 모든 짝수 값은 짝수 인덱스(0, 2, 4...)에, 모든 홀수 값은 홀수 인덱스(1, 3, 5...)에 위치하도록 만들어야 합니다.

참고로 이 문제에는 정답이 여러 개 존재할 수 있으며, 그중 어떤 것이든 하나만 찾으면 됩니다.

해결 접근 방식

이 문제는 두 개의 포인터를 사용하면 한 번의 순회로 효율적으로 해결할 수 있습니다.

  • even 포인터: 인덱스 0에서 시작하며, 짝수 인덱스를 담당합니다.
  • odd 포인터: 인덱스 1에서 시작하며, 홀수 인덱스를 담당합니다.

순회 과정에서 even 위치의 값이 홀수이고 odd 위치의 값이 짝수라면 두 값을 서로 교환(swap)한 뒤 두 포인터를 각각 2씩 앞으로 이동합니다. 반대로 이미 올바른 자리에 놓인 값이라면 해당 포인터만 2씩 이동시켜 다음 후보를 확인합니다. 이 방식의 시간 복잡도는 O(n)으로 매우 효율적입니다.

예제 코드

다음은 위 로직을 구현한 전체 코드입니다.

const arr = [1, 2, 3, 4, 5, 6];

const arrangeToIndices = (arr = []) => {
  let [even, odd] = [0, 1];
  while (even < arr.length && odd < arr.length) {
    if (arr[even] % 2 === 1 && arr[odd] % 2 === 0) {
      // 잘못된 위치에 있는 두 값을 서로 교환
      [arr[even], arr[odd]] = [arr[odd], arr[even]];
      [even, odd] = [even + 2, odd + 2];
    } else {
      // 이미 올바른 위치라면 해당 포인터만 이동
      if (0 === arr[even] % 2) {
        even += 2;
      };
      if (1 === arr[odd] % 2) {
        odd += 2;
      };
    };
  };
  return arr;
};

console.log(arrangeToIndices(arr));

실행 결과

코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

[ 2, 1, 4, 3, 6, 5 ]

출력 결과를 보면 짝수인 2, 4, 6이 각각 인덱스 0, 2, 4에 위치하고, 홀수인 1, 3, 5가 각각 인덱스 1, 3, 5에 배치되어 문제의 조건을 정확히 충족하는 것을 확인할 수 있습니다.