양의 정수 N의 이진수 표현에서, 양쪽이 1로 둘러싸인 연속된 0들의 구간(더 이상 양쪽으로 확장할 수 없는 구간)을

이진 갭(binary gap) 이라고 한다. 예를 들어,

  • 9의 이진수는 1001이며 길이 2의 이진 갭을 하나 포함한다.
  • 529의 이진수는 1000010001이며 길이 4와 길이 3의 이진 갭 두 개를 포함한다.
  • 20의 이진수는 10100이며 길이 1의 이진 갭을 하나 포함한다.
  • 15의 이진수는 1111이며 이진 갭이 없다.
  • 32의 이진수는 100000이며 이진 갭이 없다. (끝이 0으로만 이어져 1로 닫히지 않기 때문)

다음 함수를 작성하라:

 
class Solution { public int solution(int N); }

이 함수는 양의 정수 N이 주어졌을 때, 가장 긴 이진 갭의 길이를 반환해야 한다. 만약 N에 이진 갭이 없으면 0을 반환한다.

예를 들어, N = 1041일 때 N의 이진수는 10000010001이므로 가장 긴 이진 갭의 길이는 5이며, 함수는 5를 반환해야 한다. N = 32일 때는 이진수 표현이 100000이므로 이진 갭이 없어 0을 반환해야 한다.

다음 가정을 만족하는 효율적인 알고리즘을 작성하라:

  • N은 [1..2,147,483,647] 범위의 정수이다.
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class BinaryGap
{
    public int solution(int N)
    {
        // <문제>
        // BinarayGap => 이진수에서 "1과 1 사이"에 낀 0들의 길이.
        // 입력받은 정수를 이진수로 바꿨을 때, 바이너리 갭의 최대 길이를 반환해라.
 
        // 마지막이 0으로 끝나면 오른쪽에 1이 없어 닫히지 않은 구간이다.
        // 1로 끝날 때까지 오른쪽 끝의 0들을 버린다.
        while (N > 0 && (N & 1== 0)
            N >>= 1// 오른쪽으로 1칸 민다.
 
        int maxGap = 0;    
        int currentGap = 0;
 
        // 이제 끝이 1이 되었으니, 1과 1 사이의 0들을 세면 됨
        while (N > 0)
        {
            // 현재 오른쪽 끝자리 버리기
            N >>= 1;
 
            // 현재 끝자리가 0이면 아직 1로 안닫힌것.. 
            if ((N & 1== 0)
            {
                //Gap 에 추가
                currentGap++;
            }
            else
            {
                // 현재 끝자리가 1이면 닫힌 것.
                // maxGap과 현재Gap 비교한다.
                if (currentGap > maxGap)
                    maxGap = currentGap;
 
                // 다음 gap을 세야되므로 초기화
                currentGap = 0;
            }
        }
 
        // 루프가 끝났다는 건 더 이상 왼쪽에 1이 없다는 뜻.
        // 따라서 마지막에 계산하던 currentGap은 오른쪽에 1로 닫히지 않은 구간이므로 무시한다.
       
        return maxGap;
    }
 
}
 
cs

'코딜리티 > Lesson' 카테고리의 다른 글

TapeEquilibrium (누적합 + 이항)  (0) 2025.09.15
PermMissingElem (등차수열)  (0) 2025.09.14
FrogJmp  (0) 2025.09.14
OddOccrurrencesInArray (짝 없는 원소)  (0) 2025.09.13
CyclicRotation (배열 회전)  (0) 2025.09.13

+ Recent posts