https://school.programmers.co.kr/learn/courses/30/lessons/12911
- 주어진 자연수보다 큰 수 중에
- 둘다 이진수로 변환했을때 1의 갯수가 같은 수
- 그것들중 가장 작은 수
당연히 처음에는 반복문을 써주면 좋겠다고 생각이 들었고, 바로 정답판정을 받았다.
function solution(n) {
let cnt = oneLength(n);
for(let i = n+1; i<=1000000;i++){
if(cnt=== oneLength(i)){
return i.toString(10)/1;
}
}
}
function oneLength(n){
return n.toString(2).split('').filter((element) => element == '1').length;
}
OneLength(n)라는 함수는 2진수로 변환후 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);
}
너무 깔끔해서 그만 정신을 잃을뻔했다.
n.toString(2).match(/1/g).length
이것은 동일하게 2진법 변환후 filter대신 match(/1/g)를 통해서 1의 갯수를 그대로 세어주는 정규식이고
? a : solution(n,a+1);
이거를 새로운 수 , 주어진 수를 비교한 후 같다면 a , 그것이 아니라면 다시 a에 +1을 한채로 다시 돌아가는 재귀방식이었다.
문제를 풀때마다 정규식이 굉장히 자주 요구되는 것 같으니 꾸준히 이럴대마다 채워나가야할 것 같다.