Programmers/Lv2

[프로그래머스/JS] 다음 큰 숫자 (Lv2) / num.toString()

hellosonic 2023. 8. 5. 18:26

문제요약

나의 코드 및 설명 01 (시간초과)

  • n부터 1씩 숫자를 증가시키며, 10진수를 2진수로 변환하고, 1의 개수를 카운트한 후 1의 개수가 같은 수를 찾는다.
function solution(n) {
    var answer = 0;
    var bin = [];
    var originCnt = 0;
    var originNum = n;
    
    while (true){
        if (n == 0 || n == 1){
            bin.push(n);
            break;
        }
        bin.push(n % 2);
        n = parseInt(n / 2);
    }
    
    bin.map(element => {
        if (element == 1){
            originCnt += 1;
        } 
    });
    
    console.log(originCnt);
    
    var i = 1;
    var newCnt = 0;
    var result = 0;
    
    while (true){
        result = originNum + i;
        answer = result;
        newCnt = 0;
        var newBin = [];
        while (true){
            if (result == 0 || result == 1){
                newBin.push(result);
                break;
            } 
            newBin.push(result % 2);
            result = parseInt(result / 2);
        }
        newBin.map(element => {
            if (element == 1){
                newCnt += 1;
            } 
        });
        console.log(answer, newCnt);
        if (newCnt == originCnt) {
            break;
        }
        
        i+=1;
    }
    
    
    return answer;
}

나의 코드 및 설명 02 (효율성 TC 한 개 시간초과)

function bin(n){
    var result = [];
    while (true){
        if (n == 0 || n == 1){
            result.push(n);
            break;
        }
        result.push(n%2);
        n = parseInt(n/2);
    }
    return result;
}

function count(array){
    var cnt = 0;
    for (let a of array){
        if (a == 1) {
            cnt += 1;
        }
    }
    return cnt;
}

function solution(n) {
    var answer = 0;
    var num = n;
    var originCnt = count(bin(n));
    while (true){
        num += 1;
        if (count(bin(num)) == originCnt) {
            answer = num;
            break;
        }
        
        
    }
    
    return answer;
}

다른 코드 및 설명

  • num.toString()을 통해 10진수를 2진수로 변환하고, 1을 기준으로 문자열을 나누어서 배열의 길이를 구한 후 t비교한다.
function solution(n) {
    var answer = 0;
    var oneNum = n.toString(2).split("1").length;
    while (true) {
        n++;
        if (n.toString(2).split("1").length == oneNum) return n;
    }
    return answer;
}

숫자.toString(숫자) : 숫자를 문자열 혹은 진수로 변환한다.

var num = 185;

console.log(num.toString()); // '185'
console.log(num.toString(2)); // '10111001'(10진수를 2진수로 변환하고 문자열로 변환)
console.log(num.toString(8)); // '271' (10진수를 8진수로 변환하고 문자열로 변환)