이 문제의 요구 사항은 매우 간단합니다. 숫자 배열을 인수로 받는 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()를 호출하여 해당 요소를 제거합니다.
- 처음 상태:
[0, 0, 0, 14, 0, 63, 0]→ 첫 요소가 0이므로 제거 - 두 번째 반복:
[0, 0, 14, 0, 63, 0]→ 첫 요소가 0이므로 제거 - 세 번째 반복:
[0, 14, 0, 63, 0]→ 첫 요소가 0이므로 제거 - 네 번째 확인:
[14, 0, 63, 0]→ 첫 요소가 14이므로 반복 종료
이렇게 하면 배열 중간이나 끝에 있는 0은 전혀 영향을 받지 않고, 오직 앞쪽의 선행 0만 깔끔하게 제거됩니다.
참고: 성능 개선 팁
shift()는 호출될 때마다 배열의 모든 요소를 한 칸씩 앞으로 이동해야 하므로 O(n)의 시간 복잡도를 가집니다. 따라서 선행 0이 많은 대규모 배열이라면, 선행 0의 개수를 먼저 세고 splice(0, count) 또는 slice()로 한 번에 잘라내는 방식이 더 효율적일 수 있습니다.