ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [javascript] 프로그래머스 다음큰숫자
    공부/JavaScript 2019. 5. 29. 23:40

    문제 설명

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

    조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
    조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
    조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.
    예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.

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

    제한 사항

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

    입출력 예

    n result
    78 83
    15 23

    문제 풀이

    조건1 과 조건 2를 만족해야한다. 조건3은 그냥 계속 반복하면서 처음으로 만족하는 숫자를 출력하면 된다고 생각했다.

    조건 1이야 계속해서 더하니까 처음 입력값보다 숫자가 높으니까 패스

    조건 2가 문제인데

    말그대로 2진수로 변환한다음에 2진수의 개수를 확인하고 새로 비교할 숫자의 2진수 개수와 비교해서 같다면 그 값이 바로 우리가 찾는 값임으로 출력하면 된다.

    자바스크립트에 익숙하지 않아서 어떻게 문자열의 개수를 찾아야 하나 했는데

    변수.match(/찾을 문자열/g);

    이런식으로 하면 찾은 문자열이 담긴 배열이 나온다.

    지금 푸는 문제의 첫번째 예제인 78을 기준으로 해보면

    [ '1', '1', '1', '1' ]

    이렇게 찾은 문자열을 배열에 담아 출력해준다.
    이 문자열들의 개수를 우리는 찾고있으니까

    변수.match(/찾을 문자열/g).length;

    끝에 lenght를 붙여 우리가 원하는 개수만 변수에 저장하면 된다.

    그리고 입력값 보다 큰 값(조건1)이면서 2진수로 변환했을때 1의 개수가 같은 숫자(조건 2)를 찾고 그 값이 제일 작은 값(조건 3)인 숫자를 출력하면된다.

    그 값을 찾을때 까지 반복문을 돌린다 이미 우리가 원하는 1의 개수는 따로 변수에 저장해뒀으니까 n값에 1을 더해 다음 값을 계속해서 찾다가 찾으면 루프를 벗어나 찾은값을 출력하면 된다.

    function solution(n) {
        let nbi = Number(n).toString(2);
        let nbiCount = nbi.match(/1/g).length;
        while(true){
            n+=1;
            let nextbi = Number(n).toString(2);
            let nextbiCount = nextbi.match(/1/g).length;
            if(nbiCount == nextbiCount){
                break;
            }
        }
        return n;
    }
    

    후기?

    자바스크립트 문법을 몰라서 푸는데 시간이 꽤나 걸렸다..

    제대로 공부해야한다 ㅠㅠ

    댓글

Designed by Tistory.