incastle의 콩나물

[알고리즘] 백준 1074번, Z, 재귀 , python(24) 본문

python/알고리즘

[알고리즘] 백준 1074번, Z, 재귀 , python(24)

incastle 2020. 4. 13. 16:31

문제

한수는 2차원 배열 (항상 2^N * 2^N 크기이다)을 Z모양으로 탐색하려고 한다. 예를 들어, 2*2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다.

만약, 2차원 배열의 크기가 2^N * 2^N라서 왼쪽 위에 있는 칸이 하나가 아니라면, 배열을 4등분 한 후에 (크기가 같은 2^(N-1)로) 재귀적으로 순서대로 방문한다.

다음 예는 2^2 * 2^2 크기의 배열을 방문한 순서이다.

N이 주어졌을 때, (r, c)를 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오.

다음 그림은 N=3일 때의 예이다.

 

재귀 냄새가 난다면 최소 단위를 생각하자. 

2*2의 모눈 종이가 최소 단위이다. 그 단계까지 어떻게 코드를 보낼 것인가. 

N, X, Y= map(int, input().split())

result = 0
def solve(n, x, y):
    global result
    if n ==2:
        if x == X and y == Y:
            print(result)
            return
        result += 1
        
        if x==X and y+1 ==Y:
            print(result)
            return
        result += 1
        
        if x+1 == X and y == Y:
            print(result)
            return
        result += 1
        
        if x+1 == X and y+1 == Y:
            print(result)
            return
        result += 1
        return
    solve(n/2,x,y)
    solve(n/2, x, y+n/2)
    solve(n/2, x+n/2, y)
    solve(n/2, x+n/2, y+n/2)    
    

solve(2**N, 0,0)    

재귀  문제는 정말 익숙해지지가 않는 거 같다....

 

 

 

Comments