이 문제는 n
이라는 자연수가 입력되었을 때, 다음 큰 숫자를 반환하는 함수를 만드는 문제다.
문제 확인하기
문제 이름만 보면 입력값의 다음 자연수를 찾는 문제 같지도 않은 문제일 거라고 착각할 수 있지만, 사실 이 문제의 핵심은 '다음 큰 숫자'라는 것이 의미하는 것을 파악하는 것부터 시작한다.
다음 큰 숫자의 조건은 다음과 같다.
즉, n
이라는 입력값이 주어졌을 때 다음 큰 숫자x
는 x > n
이고, 2진수로 변환했을 때 x.toString(2)
1의 갯수가 n.toString(2)
랑 동일하는 숫자 중 가장 작은 숫자이다.
function countOne(num) {
let count = 0, ejin = num.toString(2).split('');
for(let i = 0; i < ejin.length; i++) {
if (ejin[i] == 1) { count++; }
}
return count;
}
function solution(n) {
let testNum = n;
while(true) {
testNum++;
if(countOne(testNum) == countOne(n)) return testNum;
}
}
처음에는 이렇게 두 개의 함수를 만들었다.
countOne(num)
은 자연수를 입력받고 2진수 변환 후 1의 갯수를 세어주는 함수solution(n)
은 반복문과 countOne(num)
을 통해 n
의 1의 갯수와 다음 자연수들의 1의 갯수를 비교하고, 일치하는 값을 찾았을 때 멈추는 함수이렇게 풀어도 효율성 테스트까지 문제 없이 바로 통과할 수 있었다.
근데 작성한 코드를 쳐다보고 있다보니 더 간결하고, 더 읽기 쉽게 작성할 수 있을 것 같다는 생각이 들었다.
function solution(n) {
let oneNum = n.toString(2).split("1").length;
while (true) {
n++;
if (n.toString(2).split("1").length === oneNum) return n;
}
}
split("1").length
를 통해 2진수로 변환된 값의 1의 갯수를 손쉽게 찾을 수 있었고,
덕분에 조금 더 간결하고 만족스러운 코드를 작성할 수 있었다.
앞으로도 단순 문제풀이에만 만족하지 않고 조금 더 간결하고 읽기 편한 코드를 작성하도록 연습할 예정이다👍