이번 글에서는 숫자를 문자열 형태로 입력받아, 문자열 맨 앞과 맨 뒤에 있는 모든 0을 제거한 새로운 문자열을 반환하는 JavaScript 함수를 작성해 보겠습니다.
예를 들어, 입력값이 다음과 같다면 −
const strNum = '054954000';
출력 결과는 아래와 같아야 합니다 −
const output = '54954';
구현 방법
가장 직관적인 접근 방식은 두 개의 포인터(인덱스)를 활용하는 것입니다. 하나는 문자열의 시작 부분부터 이동하며 앞쪽의 0을 건너뛰고, 다른 하나는 문자열의 끝 부분부터 이동하며 뒤쪽의 0을 건너뜁니다. 그런 다음 substring() 메서드를 사용해 두 인덱스 사이의 실제 숫자 부분만 잘라내면 됩니다.
이 방식은 정규표현식이나 Number() 변환 없이도 순수한 문자열 연산만으로 문제를 해결할 수 있어, 매우 큰 숫자나 소수점이 포함된 특수한 경우에도 안전하게 동작한다는 장점이 있습니다.
예제 코드
다음은 전체 구현 코드입니다 −
const strNum = '054954000';
const removeZero = (str = '') => {
let startLen = 0, endLen = str.length - 1;
// 앞쪽의 0 건너뛰기
while (str[startLen] === '0') {
startLen++;
}
// 뒤쪽의 0 건너뛰기
while (str[endLen] === '0') {
endLen--;
}
return str.substring(startLen, endLen + 1);
};
console.log(removeZero(strNum));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다 −
54954
동작 원리 살펴보기
입력값 '054954000'을 기준으로 코드의 동작 과정을 단계별로 살펴보겠습니다.
먼저 startLen은 인덱스 0에서 시작해 첫 번째 문자가 '0'인 동안 계속 증가합니다. 따라서 '0', '5'를 지나 인덱스 1('5')에서 멈춥니다. 반대로 endLen은 마지막 인덱스 8에서 시작해 뒤에서부터 '0'이 아닌 문자를 만날 때까지 감소하여 인덱스 4('4')에서 멈춥니다.
최종적으로 substring(1, 5)가 실행되어 인덱스 1부터 4까지의 문자인 '54954'가 반환됩니다.
대안: 정규표현식 활용하기
같은 결과를 더 간결하게 얻고 싶다면 정규표현식을 사용할 수도 있습니다.
const removeZero = (str = '') => str.replace(/^0+|0+$/g, '');
여기서 /^0+|0+$/g 패턴은 문자열 시작(^) 또는 끝($)에 연속된 0을 찾아 제거합니다. 다만 입력이 전부 0으로 이루어진 경우(예: '000') 빈 문자열이 반환되므로, 필요하다면 이 경우를 별도로 처리해 주는 것이 좋습니다.