[Codility Lessons] Binary Gap

Strawberry Oolong Tea·2022년 5월 21일
0

TODAY I LEARNED

목록 보기
44/51
post-thumbnail

주어진 정수의 2진수에서 가장 큰 BinaryGap을 구하는 함수를 작성하는 문제입니다.
BinaryGap이란 1로 둘러싸인 0의 길이를 말합니다.
예를 들어, 정수 1041의 2진수는 10000010001입니다. 여기서 BinaryGap의 길이는 각각 5와 3이 됩니다. 마찬가지로, 정수 32의 2진수는 100000입니다. 여기서는 0이 앞뒤로 1로 둘러싸여지지 않았기 때문에 BinaryGap의 길이는 0이됩니다.

function solution(N) {
  // 숫자를 이진수 문자열로 변환합니다.
  // 숫자 9의 경우 이진수 문자열 '1001'로 변경됩니다.
  const binary = N.toString(2);
  
  // 이진수 문자열을 배열로 변환합니다.
  // 형태는 다음과 같습니다. ['', '00', '']
  const binaryArr = binary.split("1");
  
  // 문자열 배열에서 길이가 가장 긴 문자열을 찾고 해당 문자열의 길이를 리턴합니다.
  const max = binaryArr.reduce((acc, cur) => {
    return acc.length > cur.length ? acc : cur;
  })
  
  // 만약 문자열 배열의 마지막 요소가 빈 문자열일 경우 max 값을 리턴합니다.
  // 즉, 이진수 문자열이 '1'로 끝나는 경우를 말합니다.
  // 반면, 이진수 문자열이 '1'로 끝나지 않으면 0을 리턴합니다.
  if (binaryArr[binaryArr.length - 1] === "") {
    return max.length;
  } else {
    return 0;
  }
}

테스트 케이스는 다음과 같습니다.

  • 1041 / 10000010001
  • 15 / 1111
  • 32 / 100000

테스트 케이스는 통과하지만 문제를 정확하게 풀지는 못했습니다.

채점 결과

다른 풀이를 참조하여 다시 풀었습니다.

function solution(N) {
  // 숫자를 이진수 문자열로 변환합니다.
  // 숫자 9의 경우 이진수 문자열 '1001'로 변경됩니다.
  const binaryStr = N.toString(2);
  
  // 0의 최대 길이를 저장할 변수입니다.
  let max = 0;
  
  // 1과 1사이의 0을 추적하여 그 길이를 저장할 변수입니다.
  let zerosLength = 0;
  
  // 인진수 문자열을 순서대로 돌아가며 max와 zerosLength의 값을 구합니다.
  for (let i = 0; i < binaryStr.length; i++) {
    // 문자열이 '1'일 경우 max와 zerosLength 중에서 큰 값을 최대 길이로 저장하고
    // zerosLength는 다시 초기화시켜 줍니다.
    if (binaryStr[i] === "1") {
      max = Math.max(max, zerosLength);
      zerosLength = 0;
    } else {
      // 문자열이 '0'일 경우 0의 길이를 추적하는 zerosLength를 증가시킵니다.
      zerosLength++;
    }
  }
  
  // 최종적으로 0의 최대 길이를 리턴합니다.
  return max;
}

기존 풀이에서 if 문에서 예외 처리를 제대로 해주지 못한게 가장 큰 문제점이라고 생각하고
reduce 메서드를 쓰기 위해 문자열을 다시 문자열 배열로 변환했는데 불필요한 일을 한 것 같다는 생각이 들었습니다.

다른 풀이를 참조했을 때, 어떻게 보면 간단하게 해결될 것을 스스로는 생각해내지 못한 점이 매우 아쉬웠습니다.

profile
Der Vogel kämpft sich aus dem Ei 🥚🐣 목표를 위해 끊임없이 자신의 세계를 깨뜨릴 수 있는 용감한 개발자가 되고 싶습니다.

0개의 댓글