43 lines
2.1 KiB
Python
43 lines
2.1 KiB
Python
import sys
|
|
|
|
# 표준 입력을 빠르게 받기 위한 함수 재정의
|
|
input = sys.stdin.readline
|
|
# 재귀 깊이 제한을 크게 설정하여 재귀 함수가 깊게 호출되어도 문제 없도록 함
|
|
sys.setrecursionlimit(10**6)
|
|
|
|
# N: 2^N x 2^N 크기의 배열, r: 행 번호, c: 열 번호
|
|
N, r, c = map(int, input().split())
|
|
|
|
def squared(n, r, c, tot):
|
|
# 현재 정사각형의 크기를 계산 (2^n x 2^n)
|
|
next_right, next_height = 2**n, 2**n
|
|
# 기저 사례: 정사각형의 크기가 2x2가 되었을 때 각 칸에 대해 순서를 결정
|
|
if (n == 1 and r == 0 and c == 0):
|
|
return tot # 왼쪽 위: 현재까지 누적된 tot 반환
|
|
elif (n == 1 and r == 0 and c == 1):
|
|
return tot + 1 # 오른쪽 위: tot에 1을 더해 반환
|
|
elif (n == 1 and r == 1 and c == 0):
|
|
return tot + 2 # 왼쪽 아래: tot에 2를 더해 반환
|
|
elif (n == 1 and r == 1 and c == 1):
|
|
return tot + 3 # 오른쪽 아래: tot에 3을 더해 반환
|
|
|
|
# 재귀 호출을 통해 현재 정사각형을 4개 분할 (사분면)하여 타겟 위치가 있는 사분면 선택
|
|
# 1사분면: 왼쪽 위
|
|
if (r < next_right // 2 and c < next_height // 2):
|
|
return squared(n - 1, r, c, tot)
|
|
# 2사분면: 오른쪽 위
|
|
elif (r < next_right // 2):
|
|
# 타겟이 오른쪽 위에 있으므로 왼쪽 위 사분면의 칸 수만큼 tot에 더해줌
|
|
return squared(n - 1, r, c - (2**(n - 1)), tot + 2 ** (2*n - 2))
|
|
# 3사분면: 왼쪽 아래
|
|
elif (c < next_height // 2):
|
|
# 타겟이 왼쪽 아래에 있으므로 위쪽 두 사분면의 칸 수만큼 tot에 더해줌
|
|
return squared(n - 1, r - (2**(n - 1)), c, tot + 2 ** (2*n - 1))
|
|
# 4사분면: 오른쪽 아래
|
|
else:
|
|
# 타겟이 오른쪽 아래에 있으므로 왼쪽 위, 오른쪽 위, 왼쪽 아래 사분면의 칸 수 합만큼 tot에 더해줌
|
|
return squared(n - 1, r - (2**(n - 1)), c - (2**(n - 1)), tot + (2 ** (2*n - 2) + 2 ** (2*n - 1)))
|
|
|
|
# 재귀 함수를 호출하여 결과를 출력
|
|
print(squared(N, r, c, 0))
|