[Solv:Codility] 코딜리티 Lession1 - Iterations (반복문) binary gap 자바
요즘 대기업에서도
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. 오랜만에 하니까 재밌네유