코드

n, r, c = map(int, input().split())

answer = 0

while n != 0:
    n -= 1
    
    # 제 1사분면
    if r < (2 ** n) and c < (2 ** n):
        
        # 사실상 없어도 되는 코드
        # 이해하기 쉽게 그냥 주석으로 남겨둠
        # answer += (2 ** n) * (2 ** n) * 0
        continue
        
    # 제 2사분면
    elif r < (2 ** n) and c >= (2 ** n):
        answer += (2 ** n) * (2 ** n) * 1
        c -= (2 ** n)
        
    # 제 3사분면
    elif r >= (2 ** n) and c < (2 ** n):
        answer += (2 ** n) * (2 ** n) * 2
        r -= (2 ** n)
        
    # 제 4사분면
    else:
        answer += (2 ** n) * (2 ** n) * 3
        c -= (2 ** n)
        r -= (2 ** n)
        
print(answer)

문제 해설

Z-문제풀이

위의 1, 2, 3번의 과정을 n의 값이 0이 될 때까지 반복한다.

제 1사분면일 때가 헷갈릴 수도 있다.

이동 횟수의 집계를 (0, 0)부터 시작했으므로 [(0, 0) => 1회]

(r, c)의 좌표가 n = 1이 되었을 때, 제 1사분면에 해당 좌표가 위치해 있는 경우 이를 집계에 포함하면 1회가 중복되어 들어간다고 보면 된다. 따라서 제 1사분면에 위치하게 되면 최종 이동 횟수에 굳이 값을 더 해선 안 된다.

댓글남기기