250x250
Notice
Recent Posts
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
관리 메뉴

일상 코딩

[python] 백준 온라인 알고리즘 1074번 Z, dfs 풀이 본문

코딩테스트/백준 online Judge

[python] 백준 온라인 알고리즘 1074번 Z, dfs 풀이

polarcompass 2021. 10. 10. 02:01
728x90

https://www.acmicpc.net/problem/1074

 

1074번: Z

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을

www.acmicpc.net

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

def Z(size, x,y):
    if size == 1:
        return 0
    size = size // 2
    for i in range(2):
        for j in range(2):
            if x < size * (i+1) and y < size *(j+1):
                return (2*i + j)*(size**2) + Z(size, x-i*size, y-j*size)

print( Z( 2**N, r, c ) )

 

Z

dfs를 사용하여 재귀적으로 풀었으며,

매개변수를 입력 받을때, 사각형의 한변의 크기(size)를 받고,

dfs함수 내부적으로 size= size // 2를 사용하여 4등분한 사각형 한변의 크기를 이용하였다.

if x < size * (i+1) and y < size *(j+1):

위 조건의 의미는 작은 사각형 한변을 기준으로 매개변수로 입력받은 x, y가 저 범위 안에 들어 가는지를 알아보는 것이다.

한변은 크기는 0이 될 수 없으므로 index에 1씩 더해주는 것이다.

return (2*i + j)*(size**2) + Z(size,x-i*size,y-j*size)

위 코드 블럭에서 앞부분을 설명하자면,

(2*i + j)*(size**2)
i j number
0 0 0
0 1 1
1 0 2
1 1 3

2*i +j를 통해 사각형 index 0, 1, 2, 3을 Z 모양으로 돌기위해 붙인것이고,

만약 작은 사각형 2번이 선택 되었다고 치면, 

그 앞전 지나간 사각형 개수를 선택된 index에 곱해주는 것이다.

Z(size,x-i*size,y-j*size)

재귀 부분 함수는 2로 나누어진 size를 매개변수로 주고,

원래 받았던, x, y를 작은 사각형 한변의 크기만큼 i,j에 곱하여 빼주게 되면 

r,c = 3,1

재귀적으로 2번 사각형에 들어가게되고,

2번 사각형 안에서 또 4등분되어 우리가 목표로하는 (1,1) 인덱스가 dfs함수로 들어가게 된다.

stack에 쌓여있던, Z()함수들이 호출되고 

답  11을 반환하게 된다.

 

728x90