문제 개요
문자열 str과 숫자 n을 매개변수로 받아, n의 각 비트 값을 기준으로 주어진 문자열의 알파벳 대소문자를 변환한 새로운 문자열을 반환하는 JavaScript 함수를 작성해야 합니다.
숫자 n의 각 비트는 문자열 내 알파벳 문자 하나하나에 어떤 처리를 할지 결정합니다.
- 비트가 1이면: 해당 문자의 대소문자를 반전시킵니다(소문자 → 대문자, 대문자 → 소문자).
- 비트가 0이면: 문자를 그대로 유지합니다.
n의 마지막 비트까지 적용한 후에는 다시 첫 번째 비트부터 순환하며 규칙을 이어가고, 최종적으로 완성된 새 문자열을 반환합니다.
구현 코드
다음은 이 문제를 해결하는 전체 코드입니다.
const str = 'hey there';
const num = 21;
const swapCase = (str = '', num = 1) => {
const alphaLength = str
.split('')
.reduce((acc, val) => val.toLowerCase() !== val.toUpperCase() ? ++acc : acc, 0);
let binary = num.toString(2);
while(binary.length < alphaLength){
binary += binary;
};
let res = '';
for(let i = 0; i < str.length; i++){
const el = str[i];
if(el.toUpperCase() !== el.toLowerCase() && +binary[i] === 1){
if(el.toLowerCase() === el){
res += el.toUpperCase();
}else{
res += el.toLowerCase();
}
}else{
res += el;
};
};
return res;
};
console.log(swapCase(str, num));코드 동작 원리
split('')과reduce()를 사용해 문자열에 포함된 알파벳 문자의 개수를 계산합니다.toString(2)로 숫자num(21)을 이진수 문자열 "10101"로 변환합니다.- 이진수 문자열의 길이가 알파벳 개수보다 짧으면 자기 자신을 이어 붙여 반복 확장함으로써, 비트가 끝나도 처음부터 다시 순환할 수 있도록 만듭니다.
- 마지막으로 문자열을 한 글자씩 순회하면서, 해당 인덱스의 비트가 1이고 그 문자가 알파벳인 경우에만 대소문자를 반전시켜 결과 문자열을 조립합니다.
실행 결과
위 코드를 실행하면 콘솔에 아래와 같이 출력됩니다.
HeY THeRe