Algorithm | Code Kata #16

Wook·2021년 12월 22일
0

Algorithm | Code Kata

목록 보기
16/21

문제

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

설명: 5
29의 이진수는 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


문제 접근 / 정리 / 아이디어들

  1. 십진수를 이진수로 변환한다.
  2. 문자열을 배열로 형성해준 후 (.split'')
  3. 배열 내 index를 통한 반복문을 돌려줌
  4. 0이 나올 경우마다 count에 1을 추가
  5. 1이 나올 때 count 0으로 초기화해줌

풀이 코드

const solution = N => {
  // 10진수를 2진수로 반환 후, 각각의 숫자를 배열 안에 나눈다.
  let binary = (N.toString(2)).split('');

  // count는 연속되는 0의 갯수를, result는 가장 큰 값을 가지는 변수이다.
  let count = 0;
  let result = 0;

  for (let i = 0; i < binary.length; i++) {
    // binary[i]가 0인 경우, count의 갯수를 증가시킨다.
    if (binary[i] === "0") {
      count += 1;
    } else if (binary[i] === "1") {
      // 1인 경우, count를 멈추고 result 값에 복사한다. 그리고 count 변수의 값을 다시 0으로 만든다.
        if (count > result) {
          result = count;
        }
        count = 0;
    }
  }
  
  return result;
}

느낀 점

단순히 직관적인 접근을 한다면, 경우의 수를 나누면서 진행했을 것 같다. 그럴 경우 코드가 너무 길어지기에, 문자열 길이만큼만 반복문을 돌리면서, 1이 나올 때만 0이 나온 횟수를 result에 반환시켜주었고 그 결과 끝 값이 0이 나올 때는 result에 반환이 되지 않기에 따로 조건문을 이행해줄 필요를 덜어줄 수 있었다.

profile
지속적으로 성장하고 발전하는 진취적인 태도를 가진 개발자의 삶을 추구합니다.

0개의 댓글