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

문제

https://programmers.co.kr/learn/courses/30/lessons/77885

나의 코드 (답안참조)

"""
1. 아이디어

2. 시간복잡도

"""

def convert(num):
    
    # 짝수인 경우 num보다 크며 2개 이하인 비트는 +1한 값이다.
    if num % 2 == 0: 
        return num+1
	
    
    else: # 홀수인 경우는 일정 규칙에 의거해서 num을 반환해준다.
        bin_num = '0' + bin(num)[2:]
        idx = bin_num.rfind('0')
        bin_num = list(bin_num)
        bin_num[idx] = '1'
        bin_num[idx+1] = '0'
        return int(''.join(bin_num), 2)

def solution(numbers):

    answer = [ convert(int(num)) for num in numbers]
	# 이것도 리스트 내에서 int() 안해주면 TC 7,8,9에서 에러남 이유는 모름..
    
    return answer

print(solution([2, 7]))
    

설명

1) 짝수의 경우
만약, 4라면 이진수로 100 입니다. 4보다 크면서 2개 이하로 다른 수를 찾으면 101 입니다.
즉, 가장 뒤에 있는 0을 1로 바꿔주면 됩니다.

2) 홀수의 경우
만약, 7이라면 이진수로 0111 (바꿀때 편의를 위해 앞에 0을 붙입니다)
먼저 짝수의 경우처럼 가장 뒤에서 부터 가까운 0의 인덱스(idx)를 찾아 1로 바꿉니다. 그럼 1111 이 됩니다.
bin_num[idx] = '1'
그런 다음 idx+1 의 인덱스 값을 0으로 바꿉니다. 그럼 1011이 되고 답이 됩니다.
bin_num[idx+1] = '0'

이러한 규칙 찾는게 쉬운게 아닌데 어떻게 찾는건지 이해가 안간다..
1시간 동안 삽질 후 1시간 이해했다..

참고자료

https://velog.io/@kerri/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4Lv2-2%EA%B0%9C-%EC%9D%B4%ED%95%98%EB%A1%9C-%EB%8B%A4%EB%A5%B8-%EB%B9%84%ED%8A%B8

좋은 웹페이지 즐겨찾기