문제 링크: https://www.boj.kr/1074 

 

1074번: Z

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

www.acmicpc.net

문제

한수는 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보다 작거나 같은 정수이다.

출력

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

예제 입력 1

2 3 1

예제 출력 1

11

예제 입력 2

3 7 7

예제 출력 2

63

C++ code

#include <stdio.h>
int n, r, c;

int pow2 (int k)
{
	int 1 << k;
}

int solve (int n, int x, int y)
{
	if (n == 1)
    {
    	return 2 * x + y;
    }
    
    if (x < pow2(n - 1))
    {
        if (y < pow2(n - 1)) // 1번째 영역
        	return solve(n - 1, x, y);
        else // 2번째 영역
        	return solve(n - 1, x, y - pow2(n - 1)) + pow2(2 * (n - 1));
    }
    else
    {
    	if (y < pow2(n - 1)) // 3번째 영역
        	return solve(n - 1, x - pow2(n - 1), y) + 2 * pow2(2 * (n - 1));
        else // 4번째 영역
        	return solve(n - 1, x - pow2(n - 1), y - pow2(n - 1)) + 3 * pow2(2 * (n - 1));
    }
}

int main (void)
{
	scanf("%d %d %d", &n, &r, &c);
    
    int res = solve(n, r, c);
    
    printf("%d", res);
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

1105 - 팔  (0) 2020.11.06
1081 - 합  (0) 2020.11.05
1059 - 수2  (0) 2020.11.02
1043 - 거짓말  (0) 2020.11.01
1038 - 감소하는 수  (0) 2020.10.31

+ Recent posts