본문 바로가기

Problem/이분탐색

[백준알고리즘] 1074번 Z

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


시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초128 MB77523434221343.096%

문제

한수는 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



연속된 숫자로 값이 구해질 수 있도록 범위를 반씩 나누어가면서 탐색한다.





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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include<iostream>
using namespace std;
 
int rangex[2= { 0 };
int rangey[2= { 0 };
 
int r, c;
 
void binary_search(int start, int endint flag)
{
    if (start == end && rangex[0== rangex[1&& rangey[0== rangey[1])
    {
        cout << start;
        return;
    }
 
    int median = (start+end/ 2;
 
    // x에 관하여 탐색
    if (!flag)
    {
        // 앞쪽
        if (r >= rangex[0&& r <= (rangex[0]+rangex[1])/2)
        {
            rangex[1= (rangex[0+ rangex[1]) / 2;
            binary_search(start, median, !flag);
        }
        // 뒤쪽
        else
        {
            rangex[0= (rangex[0+ rangex[1]) / 2+1;
            binary_search(median+1end!flag);
 
        }
    }
 
    // y에 관하여 탐색
    else
    {
        // 앞쪽
        if (c >= rangey[0&& c <= (rangey[0]+rangey[1]) / 2)
        {
            rangey[1= (rangey[0+ rangey[1]) / 2;
            binary_search(start, median, !flag);
        }
        // 뒤쪽
        else
        {
            rangey[0= (rangey[0+ rangey[1]) / 2 + 1;
            binary_search(median + 1end!flag);
 
        }
    }
}
 
int main(void)
{
    int N;
    int size = 1;
 
    cin >> N >> r >> c;
 
    for (int i = 0; i < N; i++)
    {
        size *= 2;
    }
 
    rangex[1= size-1;
    rangey[1= size-1;
 
    size = size*size - 1;
 
    binary_search(0,size,0);
 
    return 0;
}
cs