Loading...
본문 바로가기
👥
총 방문자
📖
0개 이상
총 포스팅
🧑
오늘 방문자 수
📅
0일째
블로그 운영

여러분의 방문을 환영해요! 🎉

다양한 개발 지식을 쉽고 재미있게 알려드리는 블로그가 될게요. 함께 성장해요! 😊

PS/프로그래머스

[프로그래머스][수학] 2개 이하로 다른 버튼

by 꽁이꽁설꽁돌 2025. 11. 19.
728x90
반응형
     
목차

     

    문제

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

     

    프로그래머스

    SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

    programmers.co.kr

     

     

    문제 구현 방향

    각 수에 대해 하나씩 늘려가며 해보는 것은 무조건 시간 초과가 날 것이라고 생각했다.

    그래서 나는 그 수에서 가장 적게 늘리는 방법을 고민하였다.

     

    비트를 차례차례 탐색한다.

     

    1. 1이면 넘어간다

    2. 0이면 1로 바꾸고 전자리를 0으로 바꾼다.

     

    -> 다 돌았을 때 0이 없었으면 비트의 자리수를 늘려준 뒤 전 자리를 0으로 만든다.

     

     

    코드 구현

    //이진수로 표현하는 함수
    function numToBinary(num){
        let str = "";
        while(num> 0){
            str = num%2 + str;
            num = Math.floor(num/ 2);
        }
        return str;
    }
    
    //이진수에서 다시 수로 바꾸어주는 함수
    function binaryToNum(arr){
        let num = 0;
        let cnt =0;
        for(let i=arr.length -1; i>=0; i--){
            num += Math.pow(2, cnt) * arr[i];
            cnt++;
        }
        return num;
    }
    
    //이진수 표현에서 가장 가까운 수 찾기
    function closeValue(str){
        let flag =1;
        let arr = str.split("");
        
        //0일때 예외처리를 해주어야 한다.
        if(arr.length === 0) return [1];
        
        for(let i=arr.length; i>= 0; i--){
            if(arr[i] === "0"){
                arr[i] ="1";
                if(i+1 <=arr.length-1) arr[i+1] = "0";
                flag = 0;
                break;
            }
        }
        if(flag){
            arr[0] = "0";
            arr.unshift("1");
        }
        return arr;
    }
    
    function solution(numbers) {
        var answer = [];
        for(let num of numbers){
            const bNum = numToBinary(num);
            const arr = closeValue(bNum);
            answer.push(binaryToNum(arr));
        }
        
        return answer;
    }
    반응형