🧑🏻💻 문제링크
탐욕 알고리즘
을 사용하여 푸는 문제이다. 문제를 보면 패턴 같은 것이 주어지는 데 만약, 7인 숫자를 2진수로 나타내면 0111로 표현할 수 있다. 여기서 7보다 크고 비트가 1~2 개로 다른 수들 중에서 제일 작은 수는 맨 앞에 0과 1을 1과 0으로 바꿔주면 된다.
즉, 10진수를 2진수로 바꾸었을 때 오른쪽에서부터 가장 가까운 0을 찾고 1로 바꿔주면 되는데 홀 수 같은 경우에는 0이 위치한 곳 + 1(왜냐하면 비트가 다른 수 중에서 제일 작은 수를 구해야 하기 때문에)에 1을 대입해주면 된다.
문제를 풀면서 다시 익힐 수 있던 부분은 2진수를 만들 때 bin()
함수 대신에 format(n, 'b')
를 이용해서 풀면 리스트의 형태로 쉽게 만들 수 있고 다시 2진수를 10진수로 만들 때 int(n, 2)
로 해주면 된다는 것이다.
진짜 프로그래머스는... 아이큐의 문제야...😂
def solution(numbers):
answer = []
for num in numbers:
# 2진수로 만들어줌
binary = list('0' + format(num, 'b'))
# 오른쪽에서부터 0이 어디에 위치해 있는지 찾음
temp = ''.join(binary).rfind('0')
binary[temp] = '1'
# num이 홀수이면
if num % 2 == 1:
binary[temp+1] = '0'
# 2진수를 다시 10진수로 변환
answer.append(int(''.join(binary), 2))
return answer