[Programmers] 2개 이하로 다른 비트 - JavaScript

Joosi_Cool·2023년 3월 19일
0

Programmers

목록 보기
44/98
post-thumbnail

문제설명

양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다.

  • x보다 크고 x비트가 1~2개 다른 수들 중에서 제일 작은 수

예를 들어,

  • f(2) = 3 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다.
비트 다른 비트의 개수
2 000...0010
3 000...0011 1
  • f(7) = 11 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다.
비트 다른 비트의 개수
7 000...0111
8 000...1000 4
9 000...1001 3
10 000...1010 3
11 000...1011 2

정수들이 담긴 배열 numbers가 매개변수로 주어집니다. numbers의 모든 수들에 대하여 각 수의 f 값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ numbers의 길이 ≤ 100,000
  • 0 ≤ numbers의 모든 수 ≤ 1015

입출력 예
numbers result
[2,7] [3,11]

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges



설계 과정

  1. 짝수 홀수 구분
    1) 짝수라면 +1 해준 값을 answer에 추가
    -> 12와 같은 짝수라면 아래와 같은 과정이기 때문
    12 -> 1100 -> 1101 (틀린 거 1개) -> OK


    2)홀수라면 아래 과정 실행
  2. 첫번째 자리부터 0인 부분을 찾음. 그 찾은 부분 자리 인덱스 만큼 2의 거듭제곱을 더해주고 그 (인덱스-1) 만큼의 거듭제곱을 다시 빼줌.
    -> 11의 예시로 들어보자
    11 -> 1011 -> 0을 찾자. 3번째 자릿수 -> 1011 + 100 - 10 -> 1101 (OK)
  3. 만약 0이 없다면? 입력값 2진수의 길이의 2거듭제곱을 더해주고 그 값에 1을 뺀 거듭제곱을 빼준다.
    -> 15를 예를 들어보자
    -> 15 - > 1111 -> 0없음 길이는? 4 -> 2^4 = 16 -> 10000 -> 1111 + 10000 - 1000 => 10111 (OK)


풀이 코드

function solution(numbers) {
    var answer = [];
    numbers.forEach((element)=>{
        //짝수라면
        if(element%2===0){
            answer.push(element+1)
        }
        //홀수라면
        else{
            var bianryNum = element.toString(2);
            for(var i = bianryNum.length-1;i>=0;i--){
                if(bianryNum[i]==='0'){
                    answer.push(element+2**(bianryNum.length-i-1)-2**(bianryNum.length-i-2));
                    break;
                }
                if(i===0){
                    answer.push(element+2**(bianryNum.length-i)-2**(bianryNum.length-i-1));
                }
            }

        }

    })
    return answer;
}


결과

profile
집돌이 FE개발자의 노트

0개의 댓글