문제 이해하기
두 개의 인수를 받는 함수 padString()을 작성해야 합니다. 첫 번째 인수는 문자열이고, 두 번째 인수는 목표 길이를 나타내는 숫자입니다. 문자열의 길이는 항상 목표 길이보다 작거나 같다고 가정합니다.
우리가 해야 할 일은 문자열 끝에 임의의 숫자(0~9)를 계속 덧붙여서 문자열의 길이가 정확히 목표 길이와 일치하도록 만든 후, 완성된 새 문자열을 반환하는 것입니다.
구현 아이디어
이 문제는 재귀(recursion)를 활용하면 매우 깔끔하게 해결할 수 있습니다. 로직은 다음과 같습니다.
1. 현재 문자열의 길이가 목표 길이보다 짧은지 확인합니다.
2. 짧다면 Math.random()으로 0부터 9 사이의 임의의 한 자리 숫자를 생성합니다.
3. 생성한 숫자를 문자열 끝에 붙인 뒤, 자기 자신을 다시 호출합니다.
4. 문자열 길이가 목표 길이에 도달하면 해당 문자열을 그대로 반환합니다.
예제 코드
const padString = (str, len) => {
if(str.length < len){
const random = Math.floor(Math.random() * 10);
return padString(str + random, len);
};
return str;
};
console.log(padString('abc', 10));
console.log(padString('QWERTY', 10));
console.log(padString('HELLO', 30));
console.log(padString('foo', 10));코드 설명
Math.floor(Math.random() * 10)은 0 이상 10 미만의 난수에 Math.floor()를 적용하여 0~9 사이의 정수 하나를 얻는 표준적인 방법입니다. 이 숫자를 기존 문자열에 이어 붙인 후 함수를 재귀적으로 호출함으로써, 문자열이 목표 길이에 도달할 때까지 한 글자씩 채워 나갑니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다. 랜덤 숫자가 사용되므로 실행할 때마다 결과는 달라집니다.
abc5189239 QWERTY2303 HELLO9332934005655101848049087 foo9039416
마무리
이처럼 재귀 함수를 사용하면 반복문 없이도 간결하고 직관적인 코드로 문자열 패딩 문제를 해결할 수 있습니다. 다만 목표 길이가 매우 클 경우에는 스택 오버플로 위험을 줄이기 위해 while 반복문으로 변환하는 것도 좋은 대안이 될 수 있습니다.