Files
Algorithm/백준/1074.py
2026-04-11 11:46:51 +09:00

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))