프로그래머의 코딩 문제(다음으로 큰 숫자)

문제 설명

자연수 n이 주어지면 다음으로 큰 수 n은 다음과 같이 정의됩니다.

  • 조건 1. n 옆의 숫자는 n보다 큰 자연수이다.
  • 조건 2. 다음으로 큰 n과 n은 이진법으로 변환했을 때 1의 개수가 같습니다.
  • 조건 3. n 옆의 숫자는 조건 1과 2를 만족하는 가장 작은 숫자입니다.

예를 들어, 78(1001110) 다음으로 큰 숫자는 83(1010011)입니다.

자연수 n이 매개변수로 주어졌을 때 다음으로 큰 수 n을 반환하는 해함수를 완성하세요.

제한

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

입/출력 예제 결과

78 83
15 23

I/O 예제 설명

I/O 예제 #1
예제 문제와 같습니다.
I/O 예제 #2
15(1111) 다음으로 큰 숫자는 23(10111)입니다.

솔루션 1

자바스크립트

function solution(n) {
    let n2 = n.toString(2).match(/1/g).length  //n의 2진수의 1개수
    while(n){
        n++
        let n3=n.toString(2).match(/1/g).length
        if(n2==n3){
            return n;
            break;
        }
    }
}

먼저 n이 이진수일 때 n2에서 1의 개수를 구합니다.

이후 while 문에서 n보다 큰 숫자가 이진법으로 n3일 때 1의 개수를 계산한다.

n2와 n3의 값이 같으면 n의 값을 반환하고 정지한다.

처음에는 1의 개수를 구하는 방법을 고민하다가 for 문으로 1의 개수를 찾아 그 안에서 n보다 큰 값을 비교했습니다.

해결해보려고 했는데 생각보다 복잡하더군요. 그래서 일치 함수에 1을 반환하고 길이를 구해서 해결했습니다.

– match() 함수는 인수에 포함된 문자를 찾으면 해당 문자를 반환합니다.