[BOJ][⚪1][백준#01074] Z

작성:    

업데이트:

카테고리:

태그: , , ,

문제 출처

BAEKJOON Online Judge #1074


문제

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

N > 1인 경우, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다. 다음 예는 22 × 22 크기의 배열을 방문한 순서이다.

N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오. 다음은 N=3일 때의 예이다.


입력

첫째 줄에 정수 N, r, c가 주어진다.


출력

r행 c열을 몇 번째로 방문했는지 출력한다.


제한

1 ≤ N ≤ 15 0 ≤ r, c < 2N


예제

예제 1

입력

2 3 1


출력

11


예제 2

입력

3 7 7


출력

63


예제 3

입력

1 0 0


출력

0


예제 4

입력

4 7 7


출력

63


예제 5

입력

10 511 511


출력

262143


예제 6

입력

10 512 512


출력

786432


My Sol

def dfs(n, i, j):
    global sumV
    if n == 0:
        return
    if i==ti and j==tj:
        return
    si = 2**(n-1) if ti >= i+2**(n-1) else 0
    sj = 2**(n-1) if tj >= j+2**(n-1) else 0
    sumV += (si**2)*2+(sj**2)
    dfs(n-1, i+si, j+sj)

N, ti, tj = map(int, input().split())

sumV = 0
dfs(N, 0, 0)
print(sumV)

인덱스를 전달인자로 두어 재귀적으로 접근하였다.


결과

맞았습니다!!

댓글남기기