[프로그래머스 lev2/JS] 2개 이하로 다른 비트

woolee의 기록보관소·2022년 11월 22일
0

알고리즘 문제풀이

목록 보기
103/178

문제 출처

프로그래머스 lev2 - 2개 이하로 다른 비트

나의 풀이

1차 시도 (81.8/100 - 시간초과)

function solution(numbers) {
  let answer = [];

  for (let i = 0; i < numbers.length; i++) {
    let tn = numbers[i];
    let cnt = 3;

    while (1) {
      tn++;
      let cpr = tn.toString(2).split("");
      let org = numbers[i].toString(2).split("");

      if (cpr.length < org.lenght) {
        while (cpr.length < org.length) {
          cpr.unshift("0");
        }
      } else {
        while (org.length < cpr.length) {
          org.unshift("0");
        }
      }

      cnt =
        cpr.length -
        org.filter((el, idx) => {
          return el === cpr[idx];
        }).length;

      if (cnt <= 2) break;
    }
    answer.push(tn);
  }

  return answer;
}

console.log(solution([2, 7]));

2차 시도

XOR 연산자 ^를 하면 일치하면 1을 반환하므로 이 1의 개수를 구하는 방식이었는데, 32bit를 넘어가면 잘라내므로 실패로 뜬다.

function solution(numbers) {
  let answer = [];

  for (let i = 0; i < numbers.length; i++) {
    let tn = numbers[i] + 1;

    while (1) {
      const XOR = (numbers[i] ^ tn).toString(2);
      const same = XOR.split("").filter((el) => el === "1").length;

      if (same <= 2) break;
      else tn++;
    }
    answer.push(tn);
  }
  return answer;
}

console.log(solution([2, 7]));

다른 풀이(통과코드)

주어진 10진수 tn이 짝수면,
2진수로 변경했을 때 0으로 끝나므로 맨 마지막 0을 1로 바꿔주면 비트가 무조건 1개만 다르다. 그러므로 tn+1이 정답이 된다.

주어진 10진수 tn이 홀수면,
tn을 2진수로 변환해주고 가장 처음 나오는 0을 찾아준다. 그리고 0의 바로 이전 자리에 1을 더해준다.(즉, 가장 처음 나오는 0을 1로 바꾸고 바로 이전 자리의 1을 0으로 변경해준다)

첫 0이 나오는 자리의 아랫자리를 더해주면 정확히 2개의 비트가 바뀌게 된다..!!

function solution(numbers) {
  let answer = [];

  for (let i = 0; i < numbers.length; i++) {
    let tn = numbers[i];

    if (tn % 2 === 0) answer.push(tn + 1);
    else {
      bit = "0" + tn.toString(2);
      let zi = bit.lastIndexOf("0");
      tn = parseInt(`${bit.slice(0, zi)}10${bit.slice(zi + 2)}`, 2);
      answer.push(tn);
    }
  }
  return answer;
}

와우..

function solution(numbers) {
  var answer = [];
  let c;
  numbers.forEach(v => {
    if (v < 2 || v % 2 === 0) {
        answer.push(v+1);
    } else {
        let c = 2;
        while(true) {
            if ((v + 1) % (c * 2) === 0) {
                c = c * 2;
            } else {
                break;
            }
        };
        answer.push(v + (c / 2));
    }
  });
  return answer;
}
profile
https://medium.com/@wooleejaan

0개의 댓글