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

JavaScript로 배열의 선행 0(앞쪽 0) 제거하기

이 문제의 요구 사항은 매우 간단합니다. 숫자 배열을 인수로 받는 JavaScript 함수를 작성해야 하며, 만약 배열의 맨 앞에 0(선행 0)이 있다면 이를 제자리(in-place)에서 제거하고, 선행 0이 없다면 아무 작업도 수행하지 않으면 됩니다.

문제 예시

예를 들어, 입력 배열이 다음과 같다고 가정해 보겠습니다.

const arr = [0, 0, 0, 14, 0, 63, 0];

배열 앞에 연속된 세 개의 0이 있으므로, 함수 실행 후 기대되는 출력 결과는 다음과 같습니다.

const output = [14, 0, 63, 0];

주목할 점은 중간에 있는 0들은 그대로 유지되어야 하고, 오직 맨 앞에 연속으로 위치한 0만 제거해야 한다는 것입니다.

해결 방법: while 반복문 활용

가장 직관적인 접근 방식은 배열의 첫 번째 요소가 0인 동안 계속해서 해당 요소를 제거하는 것입니다. JavaScript 배열의 indexOf() 메서드와 shift() 메서드를 조합하면 손쉽게 구현할 수 있습니다.

  • arr.indexOf(0) === 0 : 값이 0인 요소가 배열의 맨 앞(인덱스 0)에 있는지 확인합니다.
  • arr.shift() : 배열의 첫 번째 요소를 제거하고 배열 길이를 줄입니다.

코드 구현

const arr = [0, 0, 0, 14, 0, 63, 0];

const removeLeadingZero = arr => {
    // 첫 번째 요소가 0인 동안 계속 제거
    while (arr.indexOf(0) === 0) {
        arr.shift();
    }
};

removeLeadingZero(arr);
console.log(arr);

실행 결과

위 코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.

[ 14, 0, 63, 0 ]

동작 원리 설명

함수 내부의 while 반복문은 조건 arr.indexOf(0) === 0이 참인 동안 반복됩니다. 즉, 배열의 첫 번째 요소가 0일 때마다 shift()를 호출하여 해당 요소를 제거합니다.

  1. 처음 상태: [0, 0, 0, 14, 0, 63, 0] → 첫 요소가 0이므로 제거
  2. 두 번째 반복: [0, 0, 14, 0, 63, 0] → 첫 요소가 0이므로 제거
  3. 세 번째 반복: [0, 14, 0, 63, 0] → 첫 요소가 0이므로 제거
  4. 네 번째 확인: [14, 0, 63, 0] → 첫 요소가 14이므로 반복 종료

이렇게 하면 배열 중간이나 끝에 있는 0은 전혀 영향을 받지 않고, 오직 앞쪽의 선행 0만 깔끔하게 제거됩니다.

참고: 성능 개선 팁

shift()는 호출될 때마다 배열의 모든 요소를 한 칸씩 앞으로 이동해야 하므로 O(n)의 시간 복잡도를 가집니다. 따라서 선행 0이 많은 대규모 배열이라면, 선행 0의 개수를 먼저 세고 splice(0, count) 또는 slice()로 한 번에 잘라내는 방식이 더 효율적일 수 있습니다.