incastle의 콩나물
[알고리즘] 백준 1074번, Z, 재귀 , python(24) 본문
문제
한수는 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)
재귀 문제는 정말 익숙해지지가 않는 거 같다....
'python > 알고리즘' 카테고리의 다른 글
list vs numpy appending (0) | 2021.06.09 |
---|---|
[알고리즘] 백준 10989번, 수 정렬하기 3 , python(23) (0) | 2020.04.12 |
[알고리즘] 백준 5397번, 키로거 , 스택 , python(22) (0) | 2020.04.05 |
[알고리즘] 백준 1966번, 프린터 큐, 정렬, python(21) (0) | 2020.04.05 |
[알고리즘] 백준 1427번, 나이순 정렬 , 정렬, python(20) (0) | 2020.03.10 |
Comments