[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];
}
- 인자로 받은 정수를 이진수로 변환한 뒤 'binary'변수에 저장 👈 .toString(2)
- 변환한 2진수를 '1'을 기준으로 분할해서 배열에 저장 👈 .split(1)
- 배열을 순회하면서 각 요소들(0 또는 00 또는 000..)의 길이를 새로운 배열(countBinaryGap)에 push
- 가장 큰 값을 리턴해야하므로 countBinaryGap 배열을 내림차순 정렬한 뒤 첫번째 값을 리턴
해답
위의 풀이대로 했더니 7개 중 2개의 테스트를 통과하지 못했다. 2진수를 split하는 과정에서 1이 끝에 있다면 빈 문자열이 gapArr 배열에 포함되어있을 수 있으므로 배열을 순회할 때 gapArr.length - 1 까지만 돌아야한다.
기억할것✍️
- 정수를 2진수로 변환
Number.prototype.toString(2)
- 배열 내림차순 정렬
Array.sort((a, b) => {return b - a})