- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/77885

 

Lv2 문제이다!

처음엔 dp나 어떤 규칙이 있어야 풀릴 것 같아서 찾다가 안돼서 결국 풀이 찾아본 문제이다

코드 참고한 블로그

이해하는데 도움이 된 블로그

 

생각보다 규칙은 간단했다

숫자가 짝수라면 오른쪽 끝이 무조건 0이므로 이를 1로 바꿔주면 된다.

숫자가 홀수라면 가장 오른쪽에 있는 0을 1로 바꿔주고, 그 오른쪽에 있는 값을 0으로 바꿔준다(01 -> 10) 이렇게 하면 더 큰 수로 비트 두 개를 변경할 수 있다. 

 

연산을 마친 2진수 숫자는 10진수 숫자로 변경한 다음 answer에 추가해준다

 

- 정답 풀이 :

 

def solution(numbers):
    answer = []
    
    for number in numbers:
        bin_number = list('0' + bin(number)[2 : ])
        index = ''.join(bin_number).rfind('0') #가장 오른쪽에 있는 0의 인덱스
        bin_number[index] = '1'
        
        if number % 2 == 1:
            bin_number[index + 1] = '0'
        
        #2진수를 10진수로 변환해서 추가
        answer.append(int(''.join(bin_number), 2))
        
    return answer

+ Recent posts