배열 앞부분에 위치한 0(선행 0)만 제거하고 싶다면 filter() 메서드를 활용하면 됩니다. filter()는 주어진 조건을 통과한 요소들만 모아 새로운 배열을 반환하는 자바스크립트 배열 메서드로, 이 문제에서 핵심적인 역할을 합니다.
적용 대상 입력 배열
아래와 같은 입력 배열에서 맨 앞에 연속된 0만 제거하고, 그 뒤에 등장하는 0은 그대로 유지해 보겠습니다.
[10, 0, 12, 0, 0]
[0, 0, 0, 0, 0, 0, 10, 12, 0]
[12, 0, 0, 1, 0, 0]
예제 코드
const removeLeadingZero = input =>
input.filter((lastValue => value => lastValue = lastValue || value)(false)
);
console.log(removeLeadingZero([10, 0, 12, 0, 0]));
console.log(removeLeadingZero([0, 0, 0, 0, 0, 0, 10, 12, 0]));
console.log(removeLeadingZero([12, 0, 0, 1, 0, 0]));
동작 원리
이 코드의 핵심은 클로저(closure)입니다. 즉시 실행 함수가 false로 초기화된 변수 lastValue를 캡처하고, 내부 함수가 각 요소(value)를 순회하며 lastValue = lastValue || value 연산을 수행합니다.
- 처음에는
lastValue가false(falsy)이므로, 배열 앞쪽의 0들은 계속 falsy 상태로 유지되어 필터링되어 제거됩니다. - 0이 아닌 값이 처음 등장하는 순간
lastValue가 truthy 값으로 바뀌고, 이후에는 어떤 값이 와도 truthy를 유지하기 때문에 나머지 요소(중간에 있는 0 포함)는 모두 보존됩니다.
덕분에 별도의 인덱스 계산 없이도 '선행 0만 제거'하는 동작을 한 줄의 filter 체인으로 구현할 수 있습니다.
프로그램 실행 방법
위 프로그램을 실행하려면 Node.js 환경에서 다음 명령어를 사용합니다.
node fileName.js
여기서는 파일 이름이 demo76.js이므로 아래와 같이 실행합니다.
node demo76.js
실행 결과
프로그램을 실행하면 다음과 같은 출력을 확인할 수 있습니다.
PS C:\Users\Amit\JavaScript-code> node demo76.js
[ 10, 0, 12, 0, 0 ]
[ 10, 12, 0 ]
[ 12, 0, 0, 1, 0, 0 ]
첫 번째 배열은 앞에 0이 없어 그대로 출력되고, 두 번째 배열은 여섯 개의 선행 0이 모두 제거된 것을 확인할 수 있습니다. 세 번째 배열 역시 맨 앞의 0이 제거되고 중간의 0은 그대로 남습니다.