[codekata]Week4_Day1

문제

양수 N을 이진법으로 바꿨을 때, 연속으로 이어지는 0의 갯수가 가장 큰 값을 return해 주세요.

이어지는 0은 1과 1사이에 있는 것을 의미합니다. 1과 1사이에 있는 0을 binary gap 이라고 하겠습니다.

input: 9
output: 2

설명: 9의 이진수는 1001 입니다. 1과 1사이에 있는 0은 2 이므로, 2를 return

input: 529
output: 4

설명: 529의 이진수는 1000010001 입니다. binary gap은 4와 3 두개가 있습니다. 이 중 큰 값은 4이므로 4를 return

input: 20
output: 1

설명: 20의 이진수는 10100 입니다. 1과 1사이에 있는 연속된 0의 수는 1 뿐입니다. (뒤에 있는 0은 1사이에 있는 것이 아니므로)

input: 15
output: 0

설명: 15의 이진수는 1111 입니다. binary gap이 없으므로 0을 return

input: 32
output: 0

설명: 32의 이진수는 100000 입니다. binary gap이 없으므로 0을 return


내 풀이

const solution = N => {
  let binary = N.toString(2);
  let gapArr = binary.split(1);
  let countBinaryGap = [];

  for (let i = 0; i < gapArr.length; i++){
    countBinaryGap.push(gapArr[i].length);
  }

  countBinaryGap.sort((a, b) => {return b - a})

  return countBinaryGap[0];
}
  1. 인자로 받은 정수를 이진수로 변환한 뒤 'binary'변수에 저장 👈 .toString(2)
  2. 변환한 2진수를 '1'을 기준으로 분할해서 배열에 저장 👈 .split(1)
  3. 배열을 순회하면서 각 요소들(0 또는 00 또는 000..)의 길이를 새로운 배열(countBinaryGap)에 push
  4. 가장 큰 값을 리턴해야하므로 countBinaryGap 배열을 내림차순 정렬한 뒤 첫번째 값을 리턴


해답

위의 풀이대로 했더니 7개 중 2개의 테스트를 통과하지 못했다. 2진수를 split하는 과정에서 1이 끝에 있다면 빈 문자열이 gapArr 배열에 포함되어있을 수 있으므로 배열을 순회할 때 gapArr.length - 1 까지만 돌아야한다.

Screenshot 2022-06-05 at 16.42.45.png


기억할것✍️

  1. 정수를 2진수로 변환
    Number.prototype.toString(2)
    
  2. 배열 내림차순 정렬
    Array.sort((a, b) => {return b - a})