Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 2164 카드2

정글러 2021. 11. 15. 23:18
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배를 출력하면 정답