문제 설명도 길지 않고, 스토리텔링이 더해지지 않아서 이해하기 쉬운 착한(?) 문제 였습니다.
처음에는
자연수 n을 이진수 변환을 한 다음 — 해당 ⓐ 이진수가 갖고 있는 1의 갯수를 맞추면서 조각조각 따따따(비트 연산) 한 뒤 — 얘를 다시 10진수로 변환해서 반환해주기 —
를 상상했습니다만..
그러한 결과를 낼 수 있는 규칙성을 찾기 어려워서, 다른 방법을 시도했습니다.
n을 1씩 증가 시키면서, n+1이 조건에 맞는지(즉, ⓑ n + 1 이진수 변환 시 1의 갯수가 ⓐ와 같은지) 따져보고,
맞으면 걔가 정답!!
이라는 방법이었습니다.
첫 번째 시도 (오답, 90/100)
code
function solution(n) {
let binaryArr = toBinaryArr(n);
let countNumber1 = binaryArr.filter(v => v === 1).length;
let targetNumber = n + 1;
let targetCountNumber1 = 0;
while (countNumber1 !== targetCountNumber1) {
targetCountNumber1 = toBinaryArr(targetNumber).filter(v => v === 1).length;
targetNumber++;
}
return --targetNumber;
}
function toBinaryArr(n) {
let result = [];
while (n > 0) {
const remain = n % 2;
result = [remain, ...result];
n = Math.floor(n / 2);
}
return result;
}
review
function toBinaryArr(n) {
let result = [];
while (n > 0) {
const remain = n % 2;
result = [remain, ...result];
n = Math.floor(n / 2);
}
return result;
}
저는 먼저, 이진수 구하는 로직을 직접 작성해 보았는데요..
(사실 '두 번째 시도'에서 시도했던 방법이 떠오르지 않았음..^^)
그 결과는 바로
장렬히 실패
두 번째 시도 (정답)
code
function solution(n) {
let count1 = [...n.toString(2)].filter(v => v == 1).length;
let target = n + 1;
let targetCount1 = 0;
while (count1 !== targetCount1) {
targetCount1 = [...target.toString(2)].filter(v => v == 1).length;
target++;
}
return --target;
}