본문 바로가기
algorithm/programmers

2개 이하로 다른 비트 [프로그래머스]

by hoonzii 2021. 6. 27.
반응형

abc 주스의 b를 맡고 있는 비트

문제 풀이 정리

 

문제 설명

양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다.

  • x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수

예를 들어,

  • f(2) = 3 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다.

수 / 비트 / 다른 비트의 개수

2 000...0010  
3 000...0011 1
  • f(7) = 11 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다.

수 / 비트 / 다른 비트의 개수

7 000...0111  
8 000...1000 4
9 000...1001 3
10 000...1010 3
11 000...1011 2

정수들이 담긴 배열 numbers가 매개변수로 주어집니다. numbers의 모든 수들에 대하여 각 수의 f 값을 배열에

차례대로 담아 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ numbers의 길이 ≤ 100,000
  • 0 ≤ numbers의 모든 수 ≤ 1015

입출력 예

numbers / result

[2,7] [3,11]

 

코드

def solution(numbers):
    answer = []
    
    for number in numbers:
        if number % 2== 0: # 짝수일땐 +1
            answer.append(number+1)
        else:
            if '01' in format(number, 'b')[-2:]: # 00,10,01,11에서 11을 제외한 나머지는 +1로 가능
                answer.append(number+1)
            else: # 홀수이고 ..11로 끝나는 값,
                number_bin = format(number, 'b')
                count = 0
                for n in reversed(number_bin):
                    if n == '1':
                        count+=1
                    else:
                        break
                add_num = 2**(count-1)
                answer.append(number+add_num)
                
    
    return answer

 

문제 설명

이번 문제 풀이에 대한 설명은 답변(남겨서 뿌듯) 으로 대신하려고 한다.

 

문제 넋두리

분명 쉬워 보이는 문제를 골랐지만, 이래저래 바쁘기도 하고 시간내는게 어려워 짬짬히 뇌로만 굴려서 풀어보았다.

그랬더니 장장 일주일동안 안풀리더라...

무튼 그래도 포기하지 않고 풀었더니 아주아주 보람차다.

게다가 이번엔 힌트도 없었다! (그래서 오래걸렸지만)

 

반응형

댓글