양수 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) // (1)
let zeroArrays = [0]; // (2)
for(i = 0; i < binary.length; i++) { // (3)
let zeros = "";
if (binary[i] === "1"){ // (4)
for (j = i+1; j < binary.length; j++) { // (4)
if (binary[j] === "0") { // (5)
zeros += "0";
}
if (binary[j] === "1") { // (6)
zeroArrays.push(zeros.length)
break
}
}
}
}
return Math.max(...zeroArrays) // (7)
}
(1) 일단 상수를 이진법으로 변환하기 위해 .toString(2)
를 사용해 주었다.
(2) 배열을 선언해준다. 최소값은 0이 되어야하기 때문에 배열에 0을 넣어주었다.
(3) 이진법으로 바뀐 값을 반복문으로 돌려준다.
(4) 만약 binary[i]의 값이 1이라면 우리가 필요한 값은 1과 1사이의 0의 갯수이기 때문에
binary[i]의 다음값부터 binary[j]로 반복문을 돌려준다
(5) binary[j]가 0이라면 미리 선언해 둔 zeros에 스트링값인 0을 하나씩 추가해준다
(6) binary[j]가 1이라면 쌓아 놓았던 zeros의 길이를 배열 zeroArrays에 push
해준다
(7) Math.max()
메서드를 활용해 배열의 값에서 가장 큰 값을 반환해준다
const solution = N => {
let binary = N.toString(2) // (1)
let arr = binary.split("1") // (2)
arr.pop() // (3)
let len = arr.map(el => { // (4)
return el.length
})
return Math.max(...len) // (5)
}
(1) 상수를 이진법으로 변환해준다 eg. 32 => '100000' // 9 => '1001'
(2) 1을 기준으로 split
한다 🔑
split
을 할때 기준이 되는 값 앞, 뒤에 아무런 값이 없다면 빈 값이 배열에 출력된다
eg. '100000' => ["", "00000"] // '1001' => ["", "00", ""]
(3) pop
으로 배열의 마지막 값을 제거해준다 🔑
예시 기준 100000이라면 1과 1사이 값이 아니기 때문에 빈 값만 남게 된다
eg. [""] // ["", "00"]
(4) map
을 이용해 배열의 길이 값을 반환해준다 eg. [0] // [0, 2]
(5) Math.max()
를 활용해 최대값을 반환해준다 eg. 0 // 2