비전공자 공부일기/:: ALGORITHM

[Solv:Codility] 코딜리티 Lession1 - Iterations (반복문) binary gap 자바

와니_ 2021. 7. 25. 22:11

요즘 대기업에서도

IT 직군 뽑을 때 인적성 대신 코딩테스트가 기본이 되어버린 듯 하여..

여러 코테 플랫폼에 익숙해지기 위해 코딜리티도 뚫었다.

 

외국 사이트여서 문제도 영어로 나오는데

그래도 몇 기업에서 코테플랫폼으로 쓰고있다.

 

1번 예제 풀이 올림 - Java 자바

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

 

binary gap 문제

 

문제요약

: 주어진 자연수를 이진수로 나타냈을 때, 1과 1 사이에 나타나는 0들을 binary gap이라고 한다.

i) 1과 1 사이의 0의 집합 1개를 binary gap 1개라고 하며,

ii) 11, 1000 처럼 1 사이에 0이 없거나 마지막이 0으로 끝나는 경우는 gap 이라고 하지 않는다.

이 때 주어진 자연수의 binary gap 중에서 길이가 가장 긴 것의 0의 갯수를 구하시오

 

 

오랜만에 코테 풀어보기 및 손풀기라

아아주 무식하게 구구절절 푼 방법임!

 

class Solution {

	public static int solution(int N) {

        String bin = "";

		/*
        	주어진 자연수 N을 2진수로 변환하여 문자열로 저장
        */
        while(true)
         {
         	// 반복문 탈출조건: N이 0이나 1인 경우
            if(N == 0 || N == 1) {
                bin = "" + N + bin;
                break;
            }            
           
           // 아닌 경우 이진수로 전환하는 과정
            if(N%2 == 1) {
                bin = "1" + bin;
            } else {
                bin = "0" + bin;
            }
            N = N/2;

        }


		/*
        	i) 2진수로 변환한 문자열을 char 배열에 저장
        	ii) binary gap이 발견되면 count 시작--> cnt 변수에 0의 갯수 저장
            iii) 최댓값을 찾을 때마다 sv 변수에 저장
        */

        char[] arr = bin.toCharArray();
        int cnt=0; // 0의 갯수 세는 변수
        int sv= 0; // 최대 개수 저장하는 변수
        
        for(int i=0; i<arr.length; i++) {

            if(i == arr.length - 1) break;

            if(arr[i] == '1' && arr[i+1] == '0') {               
               cnt ++;                       
            } else if(arr[i] == '0' && arr[i+1] =='0') {
                cnt ++;
            } else if(arr[i] == '0' && arr[i+1] == '1') {
                if (sv<cnt) sv = cnt;
                cnt = 0;
            }
        }         
        return sv;

    }
}

 

 

그리고 다른 사람 솔루션도 줏어옴.

위에서 나는 이진수로 전환하는 소스를 아예 구현했는데,

Integer.toBinaryString() 이라는 좋은 함수가 있단 걸 몰랐음

str.charAt(i) 은 알고 있었는데도 막상 코드 쓸때는 기억 안나서 배열 만들어서 char 한글자씩 박아버림ㅋㅋ

솔루션 몇개 찾아보니 대부분 toBinaryString(), charAt() 써서 푼 것 같다

	public static int Solution(int N) {

		int result = 0;
		int gap = 0;
		String binary = Integer.toBinaryString(N);

		for (int i = 0; i < binary.length(); i++) {
			if ('1' == binary.charAt(i)) {
				if (gap > result) {
					result = gap;
				}
				gap = 0;
			}
			if ('0' == binary.charAt(i)) {
				gap++;
			}
		}
		return result;
	}

 

 

자바스크립트지만 아래처럼 간결하게 나타내는 방법도 있다

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://slee2540.tistory.com/50 [차가운세상]

 

 

 

느낀점:

1. 해당 언어가 제공하는 함수를 잘 알아야 하는 필요성을 느낌.

   아직은 알고리즘 공부중이라 구구절절 푸는 게 더 재밌고 보람(?)차지만,

   코테용으로는 조금 무식한 길 같다. 공부좀 합시당

 

2. 오랜만에 하니까 재밌네유