Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Tags more
Archives
Today
Total
관리 메뉴

개발자 일기장.

백준 1074문제. 본문

취업/Algorithm.

백준 1074문제.

Azderica 2020. 2. 22. 16:03

좌표 정렬하기

 


Problem?

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

 

재귀 문제Input

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

 

Output

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

 

Solution

문제를 작은 정사각형 4개로 분리해서 풀자.

그 후 다시 그 정사각형에서 문제를 풀자

 

가정

ans : 총 이동 거리

 

Code

#include	<iostream>
#include	<math.h>
using namespace std;

int ans = 0;

void solve_z(int size, int y, int x) {
	if (size == 1) {
		return;
	}
	else {
		int half_size = size / 2;
		if (x < half_size && y < half_size) {
			solve_z(half_size, y, x);
		}
		else if (x >= half_size && y < half_size) {
			ans += (half_size * half_size);
			solve_z(half_size, y, x - half_size);
		}
		else if (x < half_size && y >= half_size) {
			ans += (half_size * half_size * 2);
			solve_z(half_size, y - half_size, x);
		}
		else {
			ans += (half_size * half_size * 3);
			solve_z(half_size, y - half_size, x - half_size);
		}
	}
}

int main() {
	int N, r, c;
	cin >> N >> r >> c;

	solve_z(1 << N, r, c);

	cout << ans << "\n";

	return 0;
}

 


재귀적으로 잘 생각하면 풀 수 있는 문제였다.

 

기억을 찾아가는 느낌.

'취업 > Algorithm.' 카테고리의 다른 글

백준 2167문제.  (0) 2020.02.24
백준 11053문제.  (0) 2020.02.23
백준 11650문제.  (0) 2020.02.15
백준 10250문제.  (0) 2020.02.12
백준 1912문제.  (0) 2020.02.11