본문 바로가기

코딩 테스트/Codility

Codility BinaryGap JavaScript 풀이

https://app.codility.com/programmers/lessons/1-iterations/binary_gap/

 

BinaryGap coding task - Learn to Code - Codility

Find longest sequence of zeros in binary representation of an integer.

app.codility.com

내가 실제로 제출한 코드는 아래와 같다.

function solution(N) {
    // write your code in JavaScript (Node.js 8.9.4)
    N = N.toString(2);
    var Narr = N.match(/(0+)(?:1+)/g)
    var result = (Narr == null) ? 0 : Narr.sort(function(a, b) {return a.length < b.length;})[0].length-1
    return result;
}

 

조건문을 사용하지 않고 정규식을 사용했다.

 

정규식을 /(?:1+)(0+)(?:1+)/g로 하지 않은 이유는 1001000100001을 매칭 할 때 /(?:1+)(0+)(?:1+)/g로 매칭하게 되면,

1001을 매칭하고 나서 10001을 매칭해야 하는데 0001을 다음 문자열로 받아들여 매칭 되지 않고,

100001을 매칭했기 때문이다.

 

그래서 1001을 매칭하고 난 뒤, 10001을 매칭 할 수 있는 방법을 꽤 오래 찾다가

생각해보니 toString(2)를 통해 만들어지는 이진수의 첫째 자리가 무조건 1이라면,

굳이 1001, 10001, 100001을 매칭할 필요 없이 001, 0001, 00001을 매칭 하면 될 거 같았다.

따라서, 위의 코드와 같이 정규식을 짰다.

 

하지만 스코어가 80이 나와서 어떤 점이 문제인지는 좀 더 찾아봐야 한다.

 

참고로, 

function solution(N) {
    // write your code in JavaScript (Node.js 8.9.4)
    N = N.toString(2);
    var Narr = N.match(/(0+)(?:1+)/g)
    if (Narr == null) return 0;
    var result = Narr.reduce((acc, cur) => {
        return acc.length > cur.length ? acc : cur
    }, 0);
    return result.length-1;
}

reduce를 써서 이렇게도 풀어보았지만 이 역시도 80점이었다.

채점한 걸 보니 3개의 테스트 결과에 오류가 있어 80점이 나왔으니

테스트 결과들을 바탕으로 다시 한 번 풀어봐야 겠다.