[Codility] Lesson 1 - Binary Gap

code4109·2022년 10월 31일

coding dojo

목록 보기
1/6

codility의 lesson을 다시 풀어 봅니다.

Lesson 1 - 반복문의 Binary Gap

입력받은 양의 정수 N을 이진수로 변경한 뒤 처음 1과 다음 1 사이의 0의 갯수가 binary gap.
이진수 안에서 가장 긴 binary gap을 반환하면 되는 문제

public static int solution(int n) {
	return Stream
    		.of(Integer.toBinaryString(n)
            		.replaceAll("0+$", "")
                    .split("1+"))
            .filter(Objects::nonNull)
            .map(String::length)
            .max(Integer::compare)
            .orElse(0);
}
  • 입력받은 n을 이진수 문자열로 변경 Integer.toBinaryString(n)
  • 정규표현식으로 0으로 끝나는 문자열 trim replaceAll("0+$", "")
    • 아니면 위의 toBinaryString(n)toBinaryString(n >>> Integer.numberOfTrailingZeros(n) 이렇게 바꿔 replaceAll() 부분을 제거 가능
  • 앞서 추출한 binary gap에서 null 제거 filter(Objects::nonNull)
  • binary gap 문자열을 length 메소드로 길이로 변환 map(String::length)
  • binary gap 길이중에서 가장 큰 것을 찾음 max(Integer::compare)
  • 반환할게 없으면 0 반환 orElse(0)

반성

  • 괜히 어렵게 생각해서 0으로 시작하는 경우나 0으로 끝나는 경우 어떻게 처리할 지 고민했다. 0으로 시작하는 경우, 끝나는 경우 모두 의미 없기 때문에 애초에 leading zero는 넣지 않고 0으로 끝나는 것도 위와 같이 trim하는 방법을 찾았어야 했다.
  • 1과 1 사이의 0의 길이라는 조건에서 '1과 1'사이만 생각하느라 반복문에서 조건을 어떻게 넣을지만 고민했는데 split("1+")으로 1사이의 0으로만 이뤄진 배열을 만드는 것은 생각도 안 해봤다.

풀이 출처 : stack overflow

0개의 댓글