Codility의 Lesson 1번 BanaryGap을 Javascript로 풀어보았다
문제 내용을 대충 설명하자면 10001000 으로 나타나는
겂중 1로 감싸진 0의 갯수중 제일 큰 값을 뽑아주면 된다.
일단 첫 시도에는 기본적인 for 문을 사용해
function solution(N) {
// 2진수 바이너리 스트링으로 변환
const binary = N.toString(2);
let a = 0,
b = 0,
i;
for(i = 0; i < binary.length - 1; i++ ) {
// 넘버로 타입 변환
const n = Number(binary[i]);
if(n) {
// 1 이 등장하면 이전값과 비교해서 기록
if(a > b) b = a;
a = 0;
} else {
// 0 이 등장하면 값을 1씩 증가
a += 1;
}
}
return b;
}
아주 원초적인 코드가 완성되서 결과를 돌려보니 정답률 34%...
큰 숫자가 입력되면 바이너리 값이 길어지기 때문에
하나씩 증가 시키는 for 문은 쓰레기가 되어버린다.
그래서 0 이 연결되어 있는 부문을 잘라내어 크기를 비교하는 걸로 코드를 수정.
//final
function solution(N) {
const b = N.toString(2);
// 마지막으로 등장하는 1의 안쪽것들만 사용하기 위해
const i = b.lastIndexOf('1');
const r = b.slice(0, i) // 0으로 끝나는 부분들을 잘라낸다
.split('1') // 1로 감싸진 부분들을 모아서 array 로 만들어
.filter(el => el.length > 0 ) // 0 이 있는 부분들만 걸른 후
.map(el => el.length) // 길이를 잰 후에
.reduce( (prev, cur) => Math.max(prev, cur), 0); // 제일 큰 값을 찾는다.
return r;
}
깔끔하게 나온것 같아 결과를 돌려보니 정답률 100% 가 나왔다.
Array의 내장 메소드를 사용한 부분들 - filter, map, reduce 들은
속도나 효율적인 면들을 봐서 수정할 수는 있겠지만
코드 리딩을 위해서는 남겨놓는게 좋아보여서 일단 놔뒀다.