2^N × 2^N 크기의 Z 모양 방문 순서를 따라 특정 위치 (r, c)가 몇 번째로 방문되는지 구하는 문제 (r, c)가 속한 사분면을 찾아 이동하면서 문제를 해결함 (r, c)의 정확한 위치를 찾아 점프하는 방식 N=1의 경우부터 Z 순서를 따라가는 패턴이 있음 N=2일 때 방문 순서 예시:0 1 4 5
2 3 6 7
8 9 12 13
10 11 14 15 (r=3, c=1)의 방문 순서는 11N이 커질수록 4개의 작은 Z 패턴이 반복됨 → 사분면을 나눠서 탐색해야 함 2^N × 2^N 크기의 배열을 4개의 2^(N-1) × 2^(N-1) 크기의 사분면으로 나눈다.(r, c)가 어느 사분면에 속하는지 찾아서 해당 사분면의 시작 순서를 더한 후, 좌표를 조정하여 재귀 호출한다.| 사분면 | 시작 위치 | 조건 (r, c 위치) | 추가 방문 카운트 |
|---|---|---|---|
| 1사분면 (좌상) | 0 | r < half, c < half | 0 |
| 2사분면 (우상) | 1 * half² | r < half, c >= half | 1 * half² |
| 3사분면 (좌하) | 2 * half² | r >= half, c < half | 2 * half² |
| 4사분면 (우하) | 3 * half² | r >= half, c >= half | 3 * half² |
half = 2^(N-1), 즉 배열을 반으로 나눈 크기임 def devide(N, r, c):
if N == 0:
return 0 # 가장 작은 단위까지 내려가면 방문 순서는 0
half = 2 ** (N - 1) # 현재 크기의 반
# 1사분면 (좌상)
if r < half and c < half:
return devide(N - 1, r, c)
# 2사분면 (우상) -> 1사분면의 크기만큼 점프
if r < half and c >= half:
return 1 * half**2 + devide(N - 1, r, c - half)
# 3사분면 (좌하) -> 1,2사분면의 크기만큼 점프
if r >= half and c < half:
return 2 * half**2 + devide(N - 1, r - half, c)
# 4사분면 (우하) -> 1,2,3사분면의 크기만큼 점프
else:
return 3 * half**2 + devide(N - 1, r - half, c - half)
사분면을 나누는 기준이 헷갈릴 수 있음
(r, c)가 어느 사분면에 속하는지 확실히 이해해야 함.r >= half 또는 c >= half 조건을 사용할 때 실수할 가능성이 높음.좌표를 조정할 때 half를 빼야 함
우하 (4사분면)으로 이동할 때, (r - half, c - half)를 새로운 r, c 좌표로 사용해야 함.r - half, c - half 처리를 하지 않으면 무한 루프 발생 가능.각 사분면의 방문 순서를 더하는 논리가 정확해야 함
1사분면: 그냥 재귀 호출 2사분면: 1 * half²을 더해줌 3사분면: 2 * half²을 더해줌 4사분면: 3 * half²을 더해줌 half²을 활용해서 점프하는 개념이 중요함.재귀 호출이 너무 깊어질 수 있음
N ≤ 15이므로 재귀 호출이 15번 정도 이루어짐.sys.setrecursionlimit)를 늘릴 필요는 없지만, 너무 깊은 재귀를 피하는 것이 좋음.O(1)로 바로 값을 찾을 수 없기 때문에, N번 재귀 호출을 반복한다.O(1)이므로, 전체 시간 복잡도는 O(N).N=2, r=3, c=12 3 1N=2, r=3, c=1 → 3사분면 (+8), 새로운 (1,1)N=1, r=1, c=1 → 4사분면 (+3), 새로운 (0,0)N=0, r=0, c=0 → 011Z 모양 탐색을 어떻게 수행하는지 개념 설명
N=1부터 시작해서 N=2, N=3으로 확장 N=0도 있는거임재귀를 어떻게 사용해서 최적화하는지 설명
O(N)에 해결 half^2을 이용해 계산량을 줄이는 원리 >> 그냥 이전까지의 연산 다 더한다음 새로 시작하면 되니까 +로도 해결이 되어버림 ;;; 오답 노트 정리
r-half, c-half)에서 이해하는데 시간 좀 걸렸고half^2 곱하는 부분 이해하는데 또한 시간 좀 걸렸음 ;; half^2 점프 개념