import sys
def conquer(x, y, N):
global cnt; global result
result[cnt] = [x, y]
if N // 2 >= 1:
for i in range(x, x + N):
for j in range(y, y + N):
conquer(x, y, N//2)
conquer(x, y + N//2, N//2)
conquer(x + N//2, y, N//2)
conquer(x + N//2, y + N//2, N//2)
return
cnt += 1
N, r, c = map(int, sys.stdin.readline()[:-1].split())
cnt = 0
result = dict()
conquer(0, 0, 2**N)
answer = [key for key, val in result.items() if val == [r, c]]
print(answer[0])
- 시간 초과 발생
-> 모든 부분을 재귀 호출하지 말고, [r, c]의 위치의 cnt만 효율적으로 구해야할듯
import sys
def conquer(x, y, N):
global cnt
if x > r or x + N <= r or y > c or y + N <= c:
cnt += N ** 2
return
if N > 2:
conquer(x, y, N//2)
conquer(x, y + N//2, N//2)
conquer(x + N//2, y, N//2)
conquer(x + N//2, y + N//2, N//2)
return
else:
if r == x and c == y:
print(cnt)
elif r == x and c == y+1:
print(cnt + 1)
elif r == x+1 and c == y:
print(cnt + 2)
else:
print(cnt + 3)
exit()
N, r, c = map(int, sys.stdin.readline()[:-1].split())
cnt = 0
conquer(0, 0, 2**N)
- 1) x > r or x+N <= r or y > c or y+N <= c: 굳이 재귀 호출을 하지 않아도 되는 경우 (단위 정사각형 외의 경우) -> cnt에 N**2를 더해줌
- 2) N > 2: 재귀 호출을 진행하여 단위 정사각형에 도달해야함
- 3) 1), 2) 외의 경우: [r, c]가 있는 단위 정사각형에 도달한 경우임 -> 조건을 분기하여 cnt 출력해주기