ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Solv:Codility] 코딜리티 Lession1 - Iterations (반복문) binary gap 자바
    비전공자 공부일기/:: ALGORITHM 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. 오랜만에 하니까 재밌네유

    댓글

coding wanee