https://www.acmicpc.net/problem/1074
Z 성공
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 128 MB | 7752 | 3434 | 2213 | 43.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 end, int 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+1, end, !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 + 1, end, !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 |
'Problem > 이분탐색' 카테고리의 다른 글
[C/C++] BOJ 12738 :: 가장 긴 증가하는 부분 수열 3 (0) | 2019.02.25 |
---|---|
[C/C++] BOJ 12015 :: 가장 긴 증가하는 부분 수열 2 (0) | 2019.02.25 |
[C/C++] BOJ 2805 :: 나무 자르기 (0) | 2019.01.19 |
[백준알고리즘] 2516번 예산 (0) | 2018.11.03 |