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)
재귀 문제는 정말 익숙해지지가 않는 거 같다....