x = int(input())
def f(n) :
if n == 1 :
return 1
else :
p = 1
while n > p :
p = p * 2
n = n - p//2
return n*2
print(f(x))
|
카드가 2^n개라면 마지막에 남는 카드는 맨 밑의 카드이다.
즉, 카드 매수를 2^n +a로 표현했을 때, 한장 버리고 한장 넘기는 것을 a번 반복해서 2^n장이 남았을 때
마지막에 남는 카드는 방금 밑으로 넣어서 맨 밑에 있는 2a이다.
입력받은 매수보다 작으면서 가장 큰 2의 제곱수를 n에서 빼준 것의 2배를 출력하면 정답
'Week 01 ~ 04 : 알고리즘 문제 풀이' 카테고리의 다른 글
파이썬 백준 3190 뱀 (0) | 2021.11.15 |
---|---|
파이썬 백준 11866 요세푸스 문제 0 (0) | 2021.11.15 |
파이썬 백준 18258 큐2 (0) | 2021.11.15 |
파이썬 백준 2812 크게 만들기 (0) | 2021.11.15 |
파이썬 백준 6549 히스토그램에서 가장 큰 직사각형 (0) | 2021.11.13 |