문제 정의
문자열 str을 인수로 받아 처리하는 JavaScript 함수를 작성해야 합니다. 이 함수는 문자열 속 알파벳들이 각각 앞에 위치한 숫자를 기준으로 유효한지 검증하는 역할을 합니다.
구체적인 동작 방식은 다음과 같습니다. 먼저 문자열을 숫자를 기준으로 분리한 뒤, 각 숫자가 바로 뒤따르는 부분 문자열의 글자 수와 일치하는지 비교합니다. 모든 조합이 일치하면 해당 문자열은 유효한 것으로 판단하여 true를 반환하고, 하나라도 불일치하면 false를 반환해야 합니다.
예시
다음 문자열을 살펴보겠습니다.
5hello4from2me
이 문자열은 true를 반환해야 합니다. 숫자를 기준으로 분리하면 'hello', 'from', 'me' 세 개의 부분 문자열이 되는데, 각각의 길이가 5, 4, 2로 앞의 숫자와 정확히 일치하기 때문입니다.
코드 구현
다음은 위 문제를 해결하는 코드입니다.
const str = '5hello4from2me';
const validateString = (str = '') => {
const lenArray = [];
let temp = '';
for(let i = 0; i < str.length; i++){
const el = str[i];
if(+el){
lenArray.push([+el, '']);
}else{
const { length: len } = lenArray;
lenArray[len - 1][1] += el;
};
};
return lenArray.every(sub => sub[0] === sub[1].length);
};
console.log(validateString(str));
코드 설명
이 코드의 핵심 로직을 단계별로 살펴보겠습니다.
- 먼저 빈 배열 lenArray를 선언하여 숫자와 해당 부분 문자열을 [숫자, 문자열] 쌍의 형태로 저장합니다.
- for 반복문으로 문자열의 각 문자를 순회하면서, 단항 더하기 연산자(+el)를 사용해 현재 문자가 숫자인지 확인합니다. 숫자라면 새로운 [숫자, 빈 문자열] 쌍을 배열에 추가합니다.
- 현재 문자가 숫자가 아니라면, 마지막으로 추가된 쌍의 두 번째 요소(부분 문자열)에 해당 문자를 이어 붙입니다.
- 모든 문자 순회가 끝나면 every 메서드를 사용해 각 쌍에서 숫자 값과 실제 문자열 길이가 일치하는지 확인하고, 그 결과를 최종적으로 반환합니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
true