Level2 - 2개 이하로 다른 비트

손대중·2022년 7월 2일
0

문제 설명 및 링크

https://programmers.co.kr/learn/courses/30/lessons/77885?language=javascript

나의 풀이

문제를 보다 보니까 아래 규칙만 지키면 될 것 같아서, 실제 bit 계산이 아니라 그냥 string 으로 풀었다.

  • bit 에 '1' 만 존재하는 경우
    • 어쨌든 현재 number 보다 큰 수를 찾기 때문에, 무조건 맨 앞자리에 '1' 을 추가해야 한다.
      • ex) '111' --> '1111', '1111' --> '11111', ......
    • 추가로 큰 수중에 가장 작은 수를 찾아야 하고 최대 2개까지 달라질 수 있기 때문에, 추가된 '1' bit 를 제외한 나머지 '1' bit 들 중에서 하나를 '0' 으로 바꿔야한다. 즉, 2번째 '1' bit 를 '0' 으로 바꾸면 조건 달성
      • ex) '111' --> '1011', '1011' --> '10111', ......
  • bit 에 '0' 이 포함된 경우
    • 마찬가지로 큰 수들 중 작은 수를 찾아야 하는데, 십진수 1을 더한다고 생각해보면 변화되는 bit 는 아래와 같다.
      • ex) '110' --> '111', '10101' --> '10110', '10111' -> '11000', ......
      • 가장 마지막에 위치한 '0' bit 가 '1' 로 바뀌고, 그 다음에 위치한 bit 들이 '0' bit 로 바뀐다.
    • 즉, 가장 마지막 '0' bit + 바로 그 다음에 위치한 '1' bit 를 바꾸면 조건 달성
      • ex) '110' --> '111', '10101' --> '10110', '10111' -> '11011', ......

코드

모든 프로그래머스 문제 관련 코드들은 GitHub 링크 에 있음.

<script>
  const getMinNumber = target => {
      const targetBit = target.toString(2);
      let resultBit = targetBit;

      if (!targetBit.includes('0')) {
          // bit 가 '1' 로만 이루어진 경우 맨 앞자리 bit 에 '1' 을 더한 경우가 제일 가까운 수
          // ex) '111' -> '1011', '1111' -> '10111', ...
          resultBit = '10' + (new Array(targetBit.length - 1)).fill('1').join('');
      } else {
          // bit 가 '0', '1' 로 이루어진 경우
          // 가장 마지막에 위치한 '0' bit 에 '1' 을 더하고 바로 다음에 위치한 bit 를 '0' 으로 바꾼 경우가 제일 가까운 수
          // ex) '10' -> '11', '1011' -> '1101', '110111' -> '111011', ...
          const lastIndex = resultBit.lastIndexOf('0');
          resultBit = resultBit.split('');
          resultBit[lastIndex] = '1';
          if (lastIndex + 1 < resultBit.length) {
              resultBit[lastIndex + 1] = '0';
          }
          resultBit = resultBit.join('');
      }

      return parseInt(resultBit, 2);
  };

  function solution(numbers) {
      return numbers.map(n => getMinNumber(n));
  }
</script>

0개의 댓글