-
[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/
문제요약
: 주어진 자연수를 이진수로 나타냈을 때, 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. 오랜만에 하니까 재밌네유
'비전공자 공부일기 > :: ALGORITHM' 카테고리의 다른 글
[Solv:프로그래머스] 정렬 - 가장 큰 수 파이썬으로 풀기 (0) 2021.10.11 [Solv:프로그래머스] 정렬 - K번째 수 파이썬으로 풀기 (1) 2021.10.11 [인프런 알고리즘] 섹션2. 정렬(Sorting) - (3)삽입정렬 (0) 2020.03.08 [인프런 알고리즘] 섹션2. 정렬(Sorting) - (2)버블정렬 (0) 2020.03.08 [인프런 알고리즘] 섹션2. 정렬(Sorting) - (1)선택정렬 (0) 2020.03.08