최대 1 분 소요

문제링크 : 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=' ')

카테고리:

업데이트:

댓글남기기