[Boj] 이진수 변환 17394(python)
문제링크 : https://www.acmicpc.net/problem/17395
이진수 변환에 관련된 문제로, X와 N이 주어지고 X를 0번째 항으로 하는 N개의 수열을 구성하여
인접 항 간의 차이가 최소가 되도록하는 문제
이진수 변환은 간단하게 파이썬 내장함수인 bin()
을 사용함. 사용할 경우 0b111의 형태로 나오므로
리스트 변환시 두 번째 항부터 사용
인접항의 차가 최소가 되는 경우는 해당 이진수의 최고 자리를 0으로 변경해줄 경우 가능
또한 만약 1의 갯수가 N보다 클 경우에만 성립함
따라서 이는 이진수의 최고 자리를 각 단계마다 0으로 바꾸고, 마지막 단계에서 10진수 0으로 마무리
결국 그리디 알고리즘에 관련된 문제
X, N = map(int, input().split())
bin_X = list(bin(X))
cnt = 1
answer = []
if bin_X.count('1') < N:
print(-1)
else:
while cnt <= N:
if cnt < N:
for i in range(2, len(bin_X)):
if bin_X[i] == '1':
bin_X[i] = '0'
number = ''.join(bin_X)
answer.append(int(number, 2))
cnt += 1
break
else:
answer.append(0)
cnt += 1
for ans in answer:
print(ans, end=' ')
댓글남기기