관리 메뉴

꿈꾸는 개발자

다음 큰 숫자 본문

프로그래머스-JS풀이

다음 큰 숫자

rickysin 2023. 4. 10. 12:12

자연수 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 이하의 자연수 입니다.


 

  • 내가 작성한 코드
      function solution(n) {
        let ans = 0;
        let num = n;
        let numOfOne = func(n);
        while (true) {
          num++;
          if (numOfOne === func(num)) {
            ans = num;
            break;
          }
        }
        return ans;
      }

    function func(num) {
        return num.toString(2).match(/1/g).length;
      }
  • 일단 일치하는 답을 찾을 때까지 계속 돌려야 하기 때문에 while(true)를 사용했다. 어찌됐건  "1"의 갯수가 일치하는 숫자는 나올거라는 생각에 이렇게 코드를 작성했지만, 뭔가 while(true)만을 해주었기 때문에 찝찝한 마음은 어쩔 수 없는 것 같다.  
  • func의 경우 JS의 경우 function 체이닝으로 한 번에 "1"의 갯수를 반환하고 싶어서....저렇게 작성했다. match내부에 "1"을 전체적으로?(g 에 해당)  찾는 정규식을 넣고 반환된 배열의 length를 반환했다. (1의 갯수를 찾을 수 있음)

  • 다른 사람 풀이
function solution(n,a=n+1) {
    return n.toString(2).match(/1/g).length == a.toString(2).match(/1/g).length ? a : solution(n,a+1);
}

키야...내가 사용한 방법에 재귀까지 사용하니까 한 줄에 끝...! 너무 깔끔해 보인다. 반복문에 익숙해져서 주로 반복문만을 사용하는 데 재귀를 조금 더 적극적으로 활용해야겠다....!