문제 링크: 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 |