Bleeding edge

[프로그래머스] 2개 이하로 다른 비트 - 자바스크립트 본문

코딩테스트 공부

[프로그래머스] 2개 이하로 다른 비트 - 자바스크립트

codevil 2022. 4. 12. 14:27

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

 

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

 

programmers.co.kr

 

총 3회를 풀이했다. 1회차때랑 3회차때 풀이는 유사했으나, 2진수일때의 111과 같은경우 자리수 추가되는 경우를 생각안했었다.

2회차때는, 풀이는 괜찮았으나 시간초과가 떴었다. 2회차의 플로우는 나쁘지 않았으나.. while문을 써서 돌리는건 아무래도 시간이 많이 걸리다보니.. 마지막 두테스트케이스를 통과를 못했었다.

2회차 풀이

function solution(numbers) {
    var answer = [];
    numbers = numbers.map((element, index)=>  make(element)    ) 

    return numbers;
}
function make(num){
    let next = num+1
    num = num.toString('2');

    let go = true;
    while(go){
        let next2 = next.toString(2)
        let numlength = num.length;
        let nextlength = next2.length;
        while(numlength<nextlength){
            num = '0' + num
            numlength++;
        }
        let counter = 0;
        for(let i=0;i<numlength;i++){
        if(num[i]!==next2[i]){
            counter++
        }
        }
        if(counter<=2){
        go = false;
        }else{
        next++;            
        }

    }
        return next
}

현재 숫자에서 1개씩 더해가면 다른 숫자가 1~2개가 되면 스톱이 되게 풀었었다.

3회차때는, 규칙을 찾았었다.

1. 10000과 같이 마지막 숫자가 0으로끝나는 경우

2. 111과 같이 모든 숫자가 1인 경우

3. 1110001과 같이 [01]의 모양이 있는 경우

 

1번과 같은경우에는, 마지막 0 을 1로 바꿔주면 된다

2번과 같은 경우에는 맨앞의 1을 10으로 바꿔주면 된다.

3번과 같은 경우에는 마지막으로 나온 01을 10으로 바꿔주면 된다.

 

function solution(numbers) {
    numbers = numbers.map((element, index)=> make(element))
    return numbers;
}
function make(num){
    let num2 = num.toString('2')
    if(num2[num2.length-1]==='0'){
    
       num2= num2.split('')
        num2.pop()
        num2.push('1')
       num2= num2.join('')
    }else if( num2.lastIndexOf('01')>0){
        let index = num2.lastIndexOf('01');
        num2 = [...num2.slice(0, index), '1', '0', ...num2.slice(index+2)]
        num2 = num2.join('')
    }else{
        num2=    num2.split('')
        num2.shift()
        num2 = ['1','0',...num2]
        num2=  num2.join('')
    }
    num2 = parseInt(num2, '2')
    return num2
}

Boundary Condition 으로 틀렸었던 문제만큼 재밌었던거같다