주어진 정수의 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;
}
}
테스트 케이스는 다음과 같습니다.
테스트 케이스는 통과하지만 문제를 정확하게 풀지는 못했습니다.
다른 풀이를 참조하여 다시 풀었습니다.
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 메서드를 쓰기 위해 문자열을 다시 문자열 배열로 변환했는데 불필요한 일을 한 것 같다는 생각이 들었습니다.
다른 풀이를 참조했을 때, 어떻게 보면 간단하게 해결될 것을 스스로는 생각해내지 못한 점이 매우 아쉬웠습니다.