Code Kata | Review(7)

woongstaa·2021년 12월 20일
0

알고리즘

목록 보기
7/14
post-thumbnail

문제

양수 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

0개의 댓글