문제 설명
자연수 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() 함수는 인수에 포함된 문자를 찾으면 해당 문자를 반환합니다.
