[백준/파이썬] 1074번 Z 풀이

업데이트:



문제 정보


풀이

문제

크기 2^N x 2^N 배열을 Z 순서로 방문할 때 좌표 (r, c)가 몇 번째로 방문되는지 구하는 문제입니다.

코드

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

cnt = 0
flag = False
def search(x, y, size):
    global cnt, flag
    if size == 1:
        if (x, y) == (r, c):
            print(cnt)
            flag = True
        cnt += 1
        return
    if flag:
        return
    
    if r <= x+(size//2) and c <= y+(size//2):
        search(x, y, size//2)
    else:
        cnt += (size//2)**2
        
    if r <= x+(size//2) and c <= y+size:
        search(x, y+size//2, size//2)
    else:
        cnt += (size//2)**2
        
    if r <= x+size and c <= y+(size//2):
        search(x+size//2, y, size//2)
    else:
        cnt += (size//2)**2
        
    search(x+size//2, y+size//2, size//2)
        
search(0, 0, 2**N)

설명

현재 정사각형을 4분할해서 Z 순서(좌상, 우상, 좌하, 우하)로 탐색합니다.

목표 좌표가 포함되지 않은 사분면은 그 사분면의 칸 수((size/2)^2)만큼 cnt를 한 번에 건너뜁니다.

목표가 있는 사분면만 재귀로 내려가므로 효율적으로 순서를 구할 수 있습니다.



댓글남기기