문제 개요
숫자를 나타내는 문자열을 입력받아, 맨 앞에 위치한 0(선행 0)을 공백으로 바꾸는 JavaScript 함수를 작성해야 합니다. 이때 숫자 앞에 이미 존재하는 공백은 그대로 유지해야 한다는 점이 중요합니다.
예를 들어, 문자열 값이 다음과 같이 정의되어 있다면 −
" 004590808"
출력 결과는 다음과 같아야 합니다 −
" 4590808"
예제 코드
다음은 위 문제를 해결하는 전체 코드입니다 −
const str = ' 004590808';
const replaceWithSpace = str => {
let replaced = '';
const regex = new RegExp(/^\s*0+/);
replaced = str.replace(regex, el => {
const { length } = el;
return ' '.repeat(length);
});
return replaced;
};
console.log(replaceWithSpace(str));
실행 결과
이 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다 −
4590808
콘솔 출력에서는 선행 공백이 눈에 잘 띄지 않지만, 실제 반환된 문자열에는 매칭된 부분(기존 공백 + 선행 0)과 동일한 길이의 공백이 포함되므로 전체 문자열의 길이는 변하지 않습니다.
코드 동작 원리
- 정규 표현식 /^\s*0+/ : 문자열 시작(^)부터 이어지는 공백(\s*)과 하나 이상의 연속된 0(0+)을 찾아냅니다.
- replace() 콜백 함수 : 매칭된 문자열(el)의 길이를 구한 뒤, 같은 길이만큼의 공백(' '.repeat(length))을 반환합니다.
- 이 덕분에 원래 있던 공백은 그대로 유지되고, 0 자리만 정확히 공백으로 대체됩니다.
더 간단한 대안
위 로직은 replace()에 정규식과 화살표 함수를 직접 전달하여 한 줄로도 처리할 수 있습니다.
const replaceWithSpace = str => str.replace(/^\s*0+/, m => ' '.repeat(m.length));
console.log(replaceWithSpace(' 004590808'));
두 방식 모두 결과는 동일하며, 상황에 따라 가독성이 좋은 쪽을 선택해 사용하면 됩니다.