Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 이진수 비트를 활용해 문자열 대소문자 바꾸는 방법

문제 개요

문자열 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));

코드 동작 원리

  1. split('')reduce()를 사용해 문자열에 포함된 알파벳 문자의 개수를 계산합니다.
  2. toString(2)로 숫자 num(21)을 이진수 문자열 "10101"로 변환합니다.
  3. 이진수 문자열의 길이가 알파벳 개수보다 짧으면 자기 자신을 이어 붙여 반복 확장함으로써, 비트가 끝나도 처음부터 다시 순환할 수 있도록 만듭니다.
  4. 마지막으로 문자열을 한 글자씩 순회하면서, 해당 인덱스의 비트가 1이고 그 문자가 알파벳인 경우에만 대소문자를 반전시켜 결과 문자열을 조립합니다.

실행 결과

위 코드를 실행하면 콘솔에 아래와 같이 출력됩니다.

HeY THeRe