[프로그래머스- Level2 다음큰숫자]

정대만·2023년 6월 26일

코딩테스트

목록 보기
3/51
post-thumbnail

풀이

앞에서 이미 +1 해서 찾는 법을 알려줬기 때문에 이렇게 쉽게 ..문제를 알려주는건가.. 싶어서 나혼자 풀이법 찾을려고 노오력을 했는데 .. 결국은 안되게 되었다.

function solution(n) {
   
    var two_jin= n.toString(2).split('');

    var go_check=0;
    var count_1=0;
    var count_0=0;

    for(var i=0; i<two_jin.length; i++){
        if(two_jin[i]=='0' && two_jin[i+1]=='1' &&go_check==0){
            two_jin[i+1]='1;
            two_jin[i]='0';
            go_check=i+1;
            i+=1;
            continue;
        }

        if(two_jin[i]=="1" &&go_check!=0 ){
     
            count_1+=1;
        }
        if(two_jin[i]=="0" &&go_check!=0) {
            count_0+=1;
        }
    }
    if(count_0==0){
        two_jin.push('0'),
         count_0+=1
    }

    for(var i=go_check+1; i<two_jin.length; i++){
        if(count_0>0){
            two_jin[i]='0';
            count_0-=1;
            continue;
        }
        else{
             two_jin[i]='1';
        }
    }
  
   
    
    return  parseInt(two_jin.join(''),2)
}


78을 이진법으로 바꾸면
1001110
이다. 우리는 0 1 이렇게 반복해서 나온것을 토대로

1 0 으로 바꿔준뒤 뒤에 있는 배열의 숫자들의 1 과 0 을 카운트 한다음
0부터 채우는걸로 바꾼다음 1 을 채운다음 그값을 토대로 10진수로 바꿔주는거라고 생각했다.
근데 2개 빼고 다 틀려서 뭐지.. 싶었는데
110 인 경우 1001 이 나와야된다.
즉 01 으로된것을 찾을수 없다는 것이다.. 그래서 다 틀린거 같다.
https://latte-is-horse.tistory.com/186
해결방안으로는

  • 110 을 reverse 해서 011 으로 바꾼디
  • 그리고 '1111'과 같이 '01' 패턴이 없는 경우를 대비해 맨 뒤에 '0'을 붙여준다. -> '0110 ' 과 같이 하면된다. 오른쪽 부터 가면서 01 인것을 찾은다음 똑같이 해주면된다.
    근데 이거는 너무 복잡하고 시간이 너무 오래 걸리는듯 하다
    public int solution(int n) {
        int answer = 0;

        int cntN = Integer.bitCount(n);

        int cntA = 0;
        
        while(true){
            n++;
            cntA = Integer.bitCount(n);
            if(cntN == cntA){
                answer = n;
                break;
            }
        }

        return answer;
    }
}

profile
안녕하세요

0개의 댓글