본문 바로가기

Study

Codility Lesson 1 - BinaryGap

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 들은

속도나 효율적인 면들을 봐서 수정할 수는 있겠지만

코드 리딩을 위해서는 남겨놓는게 좋아보여서 일단 놔뒀다.

 

Lesson 1 - 난이도 Easy다. (이게?)