programmers - 다음 큰 숫자

marafo·2020년 9월 2일
post-thumbnail

문제 설명

자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.

∙ 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
∙ 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
∙ 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.

예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.

자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.

자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.

제한 사항

∙ n은 1,000,000 이하의 자연수 입니다.

끝끝내 마무리가 안되었던 코드

function solution(n) {
    let i;
    let result = n + 1;
    let nextInput;
    let count1 = 0;
    let count2 = 0;
    
    while( n >= 0){
        i = 0;
        while( Math.pow(2, i) <= n ){
            i++;
        }
        
        n -= Math.pow(2, i - 1);
        
        if( n >= 0){
            count1++;
        }
    }
    
    while( result  ){
        i = 0;
        nextInput = result;
        while( Math.pow(2, i) <= nextInput){
            i++;
        }
        
        nextInput -= Math.pow(2, i - 1);
        
        if( nextInput >= 0){
            count2++;
            
            if( count1 === count2){
                
                return result;
                break;
            }
        }
        result++;  
    }
    
}

아래는 toString 메서드를 사용한 풀이.

function solution(n) {
    let answer = n + 1;

    while (true) {
        const binaryN = n.toString(2).split("").filter(value => value === "1").length;
        const binaryAnswer = answer.toString(2).split("").filter(value => value === "1").length;

        if (binaryN === binaryAnswer) {
            break;
        }
        answer++;
    }
    return answer;
}

1) number.toString(a)는 숫자형 데이터 number를 a(이것도 숫자형)진법으로 바꿔서 문자열 형태로 리턴한다. answer는 무조건 n보다 커야하므로 편의상 n + 1로 초기화하고 시작한다.

2) 인풋 n에 대해 toString을 하고 각 이진수의 자리값들을 배열에 넣는다. 그리고 1의 갯수를 뽑아낸다. answer도 마찬가지로 진행

3) if절을 통해 binaryN과 binaryAnswer이 같아지는 순간 while문을 끝낸다.

아래는 정규표현식을 사용한 간단한 풀이와 toString 메서드에 대한 설명.

function solution(n) {
    let size = n.toString(2).match(/1/g).length;
    while( n++ ) {
        if(size === n.toString(2).match(/1/g).length){
            return n;
        }
    }
}

문제에서 요구하는 바에 대한 메서드를 알면 바로 풀 수 있고, 모르면 상당히 쉽지 않은 문제

toString을 이용한 풀이: https://ryusm.tistory.com/92
정규표현식을 이용한 풀이: 프로그래머스 다른 풀이
toString 개념: https://ko.javascript.info/number


def solution(n):
    answer = n + 1
    binaryN = bin(n).count('1')
    
    while True:
        binaryAnswer = bin(answer).count('1')
        
        if binaryN == binaryAnswer:
            break
            
        answer += 1
    
    return answer
profile
프론트 개발자 준비

0개의 댓글