매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅
엉뚱한데에서 발목잡힌 어제의 경험을 발판삼아.
예전에 봤던 템플릿인데... 하고 떠올려보니 class101 채용 때 제시되었던 코딩테스트 플랫폼.
또 해보자 뭐 어쩌겠노~
풀면서 제일 찜찜할 때가 바로 '긴가민가-' 한 부분이 있을 때다.
문제에서 제시하는 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;
}
}
자바스크립트는 내가 푼 풀이보다 다른 풀이가 더 나은 것 같았다.
감싸고 있는 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);
힘!