Python 알고리즘 문제 풀이(feat. Code Kata)

윤현묵·2021년 9월 11일
0
post-thumbnail

문제

양수 N을 이진법으로 바꿨을 때, 연속으로 이어지는 0의 갯수가 가장 큰 값을 return해 주세요.

  • 이어지는 0은 1과 1사이에 있는 것을 의미합니다.
  • 이런 것을 binary gap 이라고 합니다.

예를 들어,

input: 9
output: 2
설명: 9의 이진수는 1001 입니다. 
1과 1사이에 있는 0은 2 이므로, 2를 return
input: 529
output: 4
설명: 529의 이진수는 1000010001 입니다. 
1과 1사이에 있는 연속된 0의 수는 4와 3입니다.
이 중 큰 값은 4이므로 4를 return
input: 20
output: 1
설명: 20의 이진수는 10100 입니다. 
1과 1사이에 있는 연속된 0의 수는 1 뿐입니다.
(뒤에 있는 0은 1사이에 있는 것이 아니므로)
input: 15
output: 0
설명: 15의 이진수는 1111 입니다. 
1과 1사이에 있는 0이 없으므로 0을 return
input: 32
output: 0
설명: 32의 이진수는 100000 입니다. 
1과 1사이에 있는 0이 없으므로 0을 return

풀이 접근 방식

  1. 입력된 수를 2진수로 변환
  2. 변환된 2진수에서 1에 대한 인덱스를 따로 저장
  3. 저장된 인덱스를 빼주어 인접한 인덱스 간의 차를 구함(1사이의 0의 갯수 구하기)
  4. 인덱스 간의 차 중에 가장 큰 값을 반환
  5. 인덱스가 1개인 경우(1이 1개), 2진수로 변환한 값에 0이 없는 경우 예외처리(0 반환)

내 풀이 코드

def solution(N):
  output = []
  result = []
  b = bin(N)[2:]                                  (1)
  for i in range(len(b)):      
    if b[i] == "1":                               (2)
      output.append(i)

  if len(output) < 2 or not "0" in b:             (3)
    return 0

  for i in range(len(output)-1):
    result.append(output[i+1] - output[i] -1)     (4)
  return max(result)

풀이 설명

(1) 2진수로 변환 시 0b(2진수)의 형태로 나타나므로 0b를 제거
(2) 변환된 2진수에서 "1"이 있으면 해당하는 인덱스를 따로 저장
(여기서 1은 문자열 형태... 처음에 int형인줄 알고 그냥 1로 했으나 계속 빈값이 반환되어 "1"로 수정하였습니다..)
(3) 인덱스가 1개인 경우(1이 1개), 2진수로 변환한 값에 0이 없는 경우 예외처리(0 반환)
(4) 1에 해당하는 인덱스가 저장된 리스트므로 바로 옆의 값과 차를 구하면 0의 갯수를 구할 수 있음

profile
진정성 있는 개발자를 꿈꾼다

0개의 댓글