230203 codility BinaryGap(자바, 자바스크립트)

샨티(shanti)·2023년 2월 2일
0

코딩테스트

목록 보기
29/35
post-custom-banner

매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅

엉뚱한데에서 발목잡힌 어제의 경험을 발판삼아.
예전에 봤던 템플릿인데... 하고 떠올려보니 class101 채용 때 제시되었던 코딩테스트 플랫폼.

또 해보자 뭐 어쩌겠노~


문제 링크

BinaryGap


Java

풀면서 제일 찜찜할 때가 바로 '긴가민가-' 한 부분이 있을 때다.
문제에서 제시하는 N의 범위가 아주 넓을 때 등등...

또 한가지는 이 코드가 과연 '효율적인가?'에 대한 확신이 들지 않을 때.

코딩테스트는 풀 수 있을지 모르겠지만 처리해야 할 데이터가 기하급수적으로 늘었을 때를 생각해본다면 또 문제가 다르기에..

어쨌든 오늘 자바는 아래와 같이 풀어보았다.
codility는 효율성 체크는 따로 안해주나..?

import java.util.*;

class Solution {
    public int solution(int N) {
        // Implement your solution here

        String binaryNumber = converter(N);

        List<Integer> indexesOfOne = new LinkedList<>();

        for (int i = 0; i < binaryNumber.length(); i += 1) {
            if (binaryNumber.charAt(i) == '1') {
                indexesOfOne.add(i);
            }
        }

        if (indexesOfOne.size() < 2) {
            return 0;
        }

        int maxCountsOfZero = 0;

        for (int i = 1; i < indexesOfOne.size(); i += 1) {
            maxCountsOfZero = Math.max(maxCountsOfZero, indexesOfOne.get(i) - indexesOfOne.get(i - 1) - 1);
        }

        return maxCountsOfZero;
    }

    public String converter(int original) {
        String binaryNumber = "";

        int dividend = original;
        int remain = 0;

        while (dividend > 0) {
            remain = dividend % 2;
            dividend /= 2;

            binaryNumber = remain + binaryNumber;
        }

        return binaryNumber;
    }
}

Javascript

자바스크립트는 내가 푼 풀이보다 다른 풀이가 더 나은 것 같았다.
감싸고 있는 1을 찾고 그 1로 split을 해서 0의 갯수를 셀 생각을 하다니..
대단쓰.

첫번째 푼 내용이 내가 푼 내용이고 두번째 출이는 출처를 남기고 다른 분 것을 가져와보았다.

내가 푼 내용

function solution(N) {
  // Implement your solution here
  const binaryNumber = N.toString(2);

  if (!binaryNumber.includes('0')) {
    return 0;
  }

  const listsOfIndexOfOne = binaryNumber.split('').reduce((array, value, index) => {
    if (value === '1') {
      array.push(index);
    }

    return array;
  }, []);

  if (listsOfIndexOfOne.length < 2) {
    return 0;
  }

  let answer = 0;

  for (let i = 1; i <= listsOfIndexOfOne.length; i += 1) {
    const countsOfZero = listsOfIndexOfOne[i] - listsOfIndexOfOne[i - 1] - 1;

    if (answer < countsOfZero) {
      answer = countsOfZero;
    }
  }

  return answer;
}

다른 분 것

function solution(N) {
	const binary = N.toString(2);
	const trimmed = binary.substr(0, binary.lastIndexOf('1') + 1);
	return Math.max(...(trimmed.split('1').map(item => item.length)));
}

자바스크립트에서 진수 변환하는 건 되게 간단하지만 자꾸 잊는 것 같다.

10진 숫자를 N진수 문자열 타입으로 바꾸는 건 10진수.toString(진수)
N진수를 10진수 문자열 타입으로 바꾸는 건 parseInt(N진수, N);

힘!

profile
가벼운 사진, 그렇지 못한 글
post-custom-banner

0개의 댓글