난이도: Lv. 2
정답률: 54%
문제: https://school.programmers.co.kr/learn/courses/30/lessons/77885
알고리즘
1. 짝수인 경우 1을 더한 값이 정답 값
2. 홀수인 경우 LSB부터 0인 비트가 나올 때까지 1인 비트의 개수를 구한다.
2-1. 원래의 수에 2^(2에서 구한 개수 - 1)을 더해주면 정답 값이다.
코드
function solution(numbers) {
const answer = [];
for (const number of numbers) {
if (number % 2 === 0) { answer.push(number + 1); continue; }
const binNum = number.toString(2);
answer.push(number + Math.pow(2, binNum.length - 1));
for (let i = 1; i < binNum.length; i++) {
if (binNum[binNum.length - i - 1] === '0') {
answer[answer.length - 1] = number + Math.pow(2, i - 1);
break;
}
}
}
return answer;
}
주저리
홀짝 규칙 찾을 생각 안하고 bit-wise xor로 풀려고 했는데 테케 10, 11번이 틀렸다길래 확인해 보니 자바스크립트 xor은 32비트까지만 지원한다고 한다. 그래서 64비트 xor 연산을 할 수 있는 함수를 만들어서 해봤는데 시간초과가 났다. 비트를 하나하나 비교하는 식으로도 구현해 봤지만 그것도 시간초과 났다. 질문하기를 보니까 xor로 안 풀고 규칙 찾아서 푼 사람들이 많길래 규칙 찾아서 푸니까 금방 풀렸다. 삽질을 굉장히 오랜 시간동안 했는데 너무 열받는당~
'코딩테스트' 카테고리의 다른 글
[JS] 키패드 누르기 (0) | 2024.02.02 |
---|---|
[JS] 쿼드압축 후 개수 세기 (0) | 2024.02.01 |
[JS] 2 x n 타일링 (1) | 2024.01.25 |
[JS] 택배상자 (0) | 2024.01.22 |
[JS] 숫자 변환하기 (0) | 2024.01.18 |