본문으로 바로가기

programmers. 2개 이하로 다른 비트

category Algorithm/문제 2021. 6. 19. 11:29

문제

링크

 

코딩테스트 연습 - 2개 이하로 다른 비트

 

programmers.co.kr

풀이

우선 혼자 힘으로 해결하지 못했다..

주어진 수에서 하나씩 늘려가며 이진수로 바꾸어서 원래 수와 비교하는 식으로 했는데 어느 부분이 잘못되었는지 모르겠다

찾아보니 위와 같은 식으로 수를 하나씩 늘려서 일일이 확인해 볼 필요가 없이 주어진 수를 이진수로 바꾸고 거기서 약간의 변환을 해주면 조건에 맞는 수를 찾을 수 있다

예를 들어

5 = 101 보다 크며 비트가 2개 이하로 작은 가까운 수를 찾으려면 가장 작은 자리의 0에 1을 넣어주고 0보다 작은 자리의 1을 0으로 변환시켜주면된다
6 = 110

만약 가장 작은 자리의 0이 마지막 0이라면 마지막 자리의 0을 1로 바꾸기만 하여도 된다

4 = 100
5 = 101

만약 0이 없다면 이진수의 앞자리에 1을 추가하고 다음 수를 0으로 바꿔주면된다

15 = 01111
23 = 10111

코드

    function solution(numbers) {
        var answer = [];

        answer = numbers.map(number=>{
            const binary = number.toString(2);
            const arr = transBinary(binary);

            return tarnsNumber(arr);
        });

        function tarnsNumber(arr){
            return parseInt(arr.join(''),2);
        }
        function transBinary(str){
            const arr = str.split('');
            const lastIdx = arr.lastIndexOf('0');

            if(lastIdx === arr.length-1) {
                arr[lastIdx] = '1';
                return arr;
            }
            if(lastIdx === -1){
                arr[0] = '0';
                arr.unshift('1');
                return arr;
            }
            arr[lastIdx] = '1';
            arr[lastIdx+1] = '0';
            return arr;
        }
        return answer;
    }