codility Lesson1 - BinaryGap

요리하는코더·2021년 11월 12일
0

알고리즘 - 문제

목록 보기
33/48
post-thumbnail
post-custom-banner

코드

// you can use includes, for example:
// #include <algorithm>

// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;

int solution(int N) {
    // write your code in C++14 (g++ 6.2.0)

    int start = 0, end = 0, count = 0, answer = 0;
    while(N >= 1) {
        if(N % 2 == 1) {
            count++;
            if(count > 1) answer = answer > end - start - 1 ? answer : end-start - 1;
            start = end;
            // 10000010001
        }
        end++;
        N /= 2;
    }
    return answer;
}
function solution(N) {
const binaryNum = N.toString(2);
const binaryGaps = binaryNum.slice(binaryNum.indexOf('1') + 1, binaryNum.lastIndexOf('1'));
const zeroCounted = binaryGaps.split('1').map(zeros => zeros.length);
return zeroCounted.length ? Math.max(...zeroCounted) : 0;
}


// 출처: https://im-developer.tistory.com/178 [Code Playground]

풀이 및 소감

코딜리티를 사용해야할 일이 있어서 연습할 겸 문제를 풀었다. Lesson1이어서 문제는 빠르게 풀었다. 2진수로 바꾸면서 1의 개수를 세리다가 2번 나왔을 때 부터 길이를 체크해줬다. -1을 한 이유는 사이의 0만 세리기 위해서이다.
추가로 다른 사람들의 풀이가 궁금해서 검색해봤는데 JS로 잘 푼 거 같은 코드가 있어서 같이 첨부한다. 맨 앞과 맨 뒤의 1slice를 하고 다시 1을 기준으로 split 한 뒤에 0의 길이를 세렸다. 예를 들어 1001000100100이 있으면 001000100이 나오고 1을 기준으로 split해서 00, 000, 00이 나오고 그 길이들을 저장한 뒤에 Math.max와 전개 연산자를 활용해 정답을 찾았다.

profile
요리 좋아하는 코린이
post-custom-banner

0개의 댓글