1씩 더해서 비교한 풀이 --> 10,11번 실패
function solution(numbers) {
let answer = [];
numbers.forEach((num) => {
let std = num;
let next = num + 1;
let corr;
while (true) {
corr = (std ^ next);
let str = String(corr.toString(2)).replace(/0/g, '').length; // 불일치 수
if (2 >= str) {
answer.push(next);
break;
}
next += 1;
}
})
return answer;
}
첨부한 코드;
최하위 0을 1로바꾸고, 그 다음 비트를 0으로 바꾸는 방식으로 풀어서 1보단 더 빠른데,
8,9,10,11 테스트 케이스를 통과하지 못합니다.
뭐가 문제인걸까요? ㅠㅠ
저도 질문 하기 보면서 힌트 얻으려고 들어왔다가
너무 쉬운 문제라고 생각하시는지 아무도 답변 안하길래
겨우겨우 풀고 답변 남깁니다. (하루에 짬짬이 생각하면서...ㅠㅜ)
짝수의 경우엔 +1 하는 건 맞구요.
홀수의 경우엔 경우가 2가지 입니다.
01 로 끝나는 홀수의 경우 10 으로 즉, +1 하시면 되구요
끝이 ...1111 등으로 끝나는 경우엔 0이 나오기 전까지 마지막의 1의 갯수가 중요하더라구요
3 = 011 (마지막 1의 개수 2개)
4 = 100
5 = 101 (3 + (2 ** (1의 개수-1) )) = (3 + (2** (2-1) )) = 5
7 = 111 (마지막 1의 개수 3개)
8 = 1000
9 = 1001
10 = 1010
11 = 1011 (7 + (2 ** (1의개수) -1)) = (7 + (2** (3-1)) ) = 11
저..는 그렇게 풀었는데 좋은 의견있으면 남겨주시면 감사하겠습니다.
맞아요 다만 01로 끝나는 경우 그냥 +1 하실필요 없이 연속되는 1의 수가 1개니까 2**(1-1) == 1 나와서 그냥 다 2**(1의수-1) 더해주되 최소 1은 더해줘야 된다로 푸셔두되요.(최소 1인 이유는 짝수의 경우 연속1의 수가 0개이므로 2**(0-1) 해서 0.5가 나옵니다.)
앗 처음부터 짝수, 홀수는 크게 필요 없었군요. 감사합니다 :)
감사합니다. 덕분에 풀었습니다