강의로 돌아가기
푸르

테스트 케이스 10,11번 통과하신분들

  1. 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;
    }

  2. 첨부한 코드;
    최하위 0을 1로바꾸고, 그 다음 비트를 0으로 바꾸는 방식으로 풀어서 1보단 더 빠른데,
    8,9,10,11 테스트 케이스를 통과하지 못합니다.

뭐가 문제인걸까요? ㅠㅠ

작성중인 코드―solution.js
1
2
3
4
5
6
7
8
9
10
11
12
13
function solution(numbers) {
    let answer = [];
    numbers.forEach((num) => {
        if (num % 2 === 0) {
            answer.push(num + 1);
        } else if (num % 2 === 1) {
            let zero = (num + 1) & ((~num) + 1);
            let result = (num | zero) & (~(zero >> 1));
            answer.push(result)
        }
    })
    return answer;
}
1 개의 답변
훈지

저도 질문 하기 보면서 힌트 얻으려고 들어왔다가
너무 쉬운 문제라고 생각하시는지 아무도 답변 안하길래
겨우겨우 풀고 답변 남깁니다. (하루에 짬짬이 생각하면서...ㅠㅜ)

짝수의 경우엔 +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가 나옵니다.)

    올리브―2021.06.27 20:31
  • 훈지

    앗 처음부터 짝수, 홀수는 크게 필요 없었군요. 감사합니다 :)

    훈지―2021.06.28 08:51
  • jay

    감사합니다. 덕분에 풀었습니다

    jay―2021.08.16 16:57
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.