본문 바로가기

프로그래머스 - Lv.2 2개 이하로 다른 비트 JS 본문

개발/algorithm

프로그래머스 - Lv.2 2개 이하로 다른 비트 JS

자전하는명왕성 2023. 10. 8. 09:46

https://school.programmers.co.kr/learn/courses/30/lessons/77885

 

생각한 풀이과정은 다음과 같다.

 

numbers 의 요소가 짝수인 경우, 2진수로 변환했을 때 마지막 비트는 무조건 0이다.

'4'를 예로 들면, 4의 이진수가 '1000' 일 때, 마지막 비트 0을 1로 수정하면 1001(5)가 되므로

비트가 1~2개 다른 수 중 가장 작은 수가 5임을 확인할 수 있다. 따라서 짝수일 경우는 n이 주어질 때 n+1.

 

하지만 numbers의 요소가 홀수인 경우는 직접 구해야 한다.

만약 '7'이 주어질 경우의 7의 이진수는 111인데, 조건이 이보다는 커야 하므로 비트 자릿수는 최소 4자릿수이어야 한다.

때문에, 홀수 n이 주어진 경우는 7을 이진법으로 바꾼 수에 앞에 0을 붙여 활용했다. => '0111'

그리고 이때 '0111'의 0과 1의 위치를 바꾸면, 문제의 조건인 주어진 수보다 크며, 비트 위치가 다른 수를 만족하게 된다. ('1011'(11))

 

이때 중요한 것은 바꿔야 하는 0의 위치인데, 뒤에서부터 처음 등장하는 '0'의 위치를 기준으로 삼으면 된다.

(n이 '9' 일 경우는 1001 => 01001 로, 01010 으로 수정하면 된다.)

이후 수정한 수를 10진수로 수정하여 반환한다.

 

function solution(numbers) {
  const act = (n) => {
    if(n % 2 === 0) return n + 1
    else {
    // 홀수인 경우, 2진법 변환 후 앞에 0붙임
    // '문자열 자르기' 메서드보다 배열로 재선언 후 수정하는 것이 더 효율적이라 생각해 배열로 선언
      const arr = ('0' + n.toString(2)).split('')
      for(let i = arr.length - 1 ; i >= 0 ; i --) {
      // 0 등장 시 앞 위치의 수와 해당 위치의 수를 수정
        if(arr[i] === '0') {
          [arr[i+1], arr[i]] = ['0', '1']
          break
        }
      }  
      // 10진수로 바꾼 뒤 반환
      return parseInt(arr.join(''),2)
    }
  }

  return numbers.map(el => act(el))
}


console.log(solution([2,7]))

 

Comments