문제


한수는 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일 때의 예이다.

 

 

 

입력


첫째 줄에 N r c가 주어진다. N은 15보다 작거나 같은 자연수이고, r과 c는 0보다 크거나 같고, 2^N-1보다 작거나 같은 정수이다.

 

출력


첫째 줄에 문제의 정답을 출력한다.

 

예제 입력과 출력

 

 

 

 

알고리즘 분류


수학

분할 정복

재귀 호출

 

정답

 

n,r,c=map(int, input().split(' '))
num=0

while n>0:
    a=2**n // 2
    if n > 1:
        if a > r and a <= c: 
            num=num+ a**2
            c =c- a
        elif a <= r and a > c: 
            num=num+ (a**2)*2
            r =r- a
        elif a <= r and a <= c: 
            num=num+ (a**2)*3
            c =c- a
            r =r- a
            
    elif n == 1:
        if r == 0 and c == 1:
            num=num+1
        elif r == 1 and c == 0:
            num=num+2
        elif r == 1 and c == 1:
            num=num+3
    n=n-1

print(num)

 


백준 알고리즘 1074번 : https://www.acmicpc.net/problem/1074

 

1074번: Z

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

www.acmicpc.net

 

+ Recent posts