문제 상황
JavaScript에서 문자열 str을 첫 번째 인수로, 정수 n을 두 번째 인수로 받는 함수를 작성해야 합니다. 문자열 str은 영숫자(alphanumeric)와 하이픈(-)으로 구성되어 있습니다.
하이픈은 문자열 내의 영숫자들을 그룹으로 나누는 역할을 합니다. 즉, 하이픈이 n개 있다면 문자열은 n+1개의 그룹으로 분할됩니다. 다만 주어진 문자열에서 하이픈의 위치가 잘못 배치되어 있을 수 있습니다.
우리의 목표는 각 그룹이 정확히 K개의 문자를 가지도록 만드는 것입니다. 단, 첫 번째 그룹만 예외적으로 K보다 짧아도 되지만, 최소한 한 개 이상의 문자를 포함해야 합니다.
이 요구 사항을 충족하기 위해 하이픈을 다시 삽입해야 하며, 동시에 문자열 내 모든 소문자를 대문자로 변환해야 합니다.
예를 들어, 함수에 다음과 같이 입력된다면 −
const str = '8-4B0t37-k';
const num = 4;
출력 결과는 다음과 같아야 합니다 −
const output = '84B0-T37K';
출력 설명
문자열 str이 두 부분으로 나뉘었으며, 각 부분은 4개의 문자로 구성되어 있습니다.
구현 예제
이 문제를 해결하는 코드는 다음과 같습니다 −
const str = '8-4B0t37-k';
const num = 4;
const formatKey = (str = '', num = 1) => {
let acc = '';
let flag = num;
for(let i = str.length - 1; i >= 0; i--){
const char = str.charAt(i);
if(char !== '-') {
if(flag === 0) {
acc = `-${acc}`;
flag = num;
};
acc = `${char.toUpperCase()}${acc}`;
flag -= 1;
};
};
return acc;
};
console.log(formatKey(str, num));
코드 설명
formatKey() 함수에서 수행한 핵심 단계는 다음과 같습니다 −
역방향 순회: 문자열을 뒤에서부터 앞으로 순회했습니다. 이렇게 하면 남은 문자 수가
num보다 적은 경우(첫 번째 그룹은 반드시num개일 필요가 없으므로)를 자연스럽게 처리할 수 있습니다.문자 개수 카운트: 삽입된 문자의 개수를 계속 추적하다가, 카운트가 0이 되면 하이픈을 삽입하고 카운트를
num으로 초기화합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
84B0-T37K