https://programmers.co.kr/learn/courses/30/lessons/77885?language=javascript
문제를 보다 보니까 아래 규칙만 지키면 될 것 같아서, 실제 bit 계산이 아니라 그냥 string 으로 풀었다.
'111' --> '1111'
, '1111' --> '11111'
, ......'111' --> '1011'
, '1011' --> '10111'
, ......'110' --> '111'
, '10101' --> '10110'
, '10111' -> '11000'
, ......'110' --> '111'
, '10101' --> '10110'
, '10111' -> '11011'
, ......모든 프로그래머스 문제 관련 코드들은 GitHub 링크 에 있음.
<script>
const getMinNumber = target => {
const targetBit = target.toString(2);
let resultBit = targetBit;
if (!targetBit.includes('0')) {
// bit 가 '1' 로만 이루어진 경우 맨 앞자리 bit 에 '1' 을 더한 경우가 제일 가까운 수
// ex) '111' -> '1011', '1111' -> '10111', ...
resultBit = '10' + (new Array(targetBit.length - 1)).fill('1').join('');
} else {
// bit 가 '0', '1' 로 이루어진 경우
// 가장 마지막에 위치한 '0' bit 에 '1' 을 더하고 바로 다음에 위치한 bit 를 '0' 으로 바꾼 경우가 제일 가까운 수
// ex) '10' -> '11', '1011' -> '1101', '110111' -> '111011', ...
const lastIndex = resultBit.lastIndexOf('0');
resultBit = resultBit.split('');
resultBit[lastIndex] = '1';
if (lastIndex + 1 < resultBit.length) {
resultBit[lastIndex + 1] = '0';
}
resultBit = resultBit.join('');
}
return parseInt(resultBit, 2);
};
function solution(numbers) {
return numbers.map(n => getMinNumber(n));
}
</script>