코딩테스트

[프로그래머스/javascript] 2개이하의 다른 비트 (꼭 다시풀기)

_서리__ 2023. 3. 8. 16:54
function solution(numbers) {
    var answer = [];
    function beat(n){
        let num = n.toString(2);
        if(num.length<17){
           num="0".repeat(17-num.length)+num
        }
        let newNums = [];
        for(let i=0;i<num.length;i++){
            if(num[i]==="0"){
                newNums.push(num.slice(0,i)+"1"+num.slice(i+1))
                for(let j=i+1;j<num.length;j++){
                    if(num[j]==="0"){
                    newNums.push(num.slice(0,i)+"1"+num.slice(i+1,j)+"1"+num.slice(j+1))}
                    else{
                    newNums.push(num.slice(0,i)+"1"+num.slice(i+1,j)+"0"+num.slice(j+1))}
                    }
                }
            else if(num[i]==="1"){
            newNums.push(num.slice(0,i)+"0"+num.slice(i+1))
               for(let j=i+1;j<num.length;j++){
                    if(num[j]==="1"){
                    newNums.push(num.slice(0,i)+"0"+num.slice(i+1,j)+"0"+num.slice(j+1))}
                    else{
                    newNums.push(num.slice(0,i)+"0"+num.slice(i+1,j)+"1"+num.slice(j+1))}
                    } 
            }
        }
        return Math.min(...[...new Set(newNums)].map((el)=>parseInt(el,2)).filter((el)=>el>n))
        }
    for(let i=0;i<numbers.length;i++){
        answer.push(beat(numbers[i]))
    }
    return answer
}

처음 푼 풀이 아주 더럽게 풀었다 ㅎㅎ..ㅎ

 

function solution(numbers) {
    var answer = [];
    //1.짝수인경우 -> 마지막 자리의 수가 0이므로 +1해주기
    //2.홀수인경우 -> 뒤에서부터 세서 가장먼저 0인수를 찾아서 01을 10으로 바꿔주기.
    for(let i=0;i<numbers.length;i++){
        if(numbers[i]%2===0){
            answer.push(numbers[i]+1)
        }else{
            let str = "0"+numbers[i].toString(2) //처음에 0을 붙여줌
            for(let j=str.length-1;j>=0;j--){
                if(str[j]==="0"){
                    answer.push(parseInt(str.substring(0,j)+"10"+str.substring(j+2),2))
                    break;
                }
            }
        }
    }
    return answer
}

다른분들의 풀이를 참고해서 푼 풀이