Algorithm/분할정복

BOJ#1074 Z

밤이2209 2017. 8. 24. 17:35

BOJ#1074 Z


* 문제




* 풀이

- 분할정복을 사용하는 알고리즘들은 대개 3가지의 구성 요소를 갖고 있습니다.

 1. 문제를 더 작은 문제로 분할하는 과정(divide)
 2. 각 문제에 대해 구한 답을 원래 문제에 대한 답으로 병합하는 과정(merge)
 3. 더 이상 답을 분할하지 않고 곧장 풀 수 있는 매우 작은 문제(base case)
(출처 : 알고리즘 문제 해결 전략)


위 해결 전략을 염두하고 알고리즘을 구상해봅시다.

1. 나눌 수 있는 경우 (divide & merge)


(r, c)가 몇 사분면에 있는지 알아냅니다

만약 3 사분면이라면
1, 2 사분면의 사각형의 개수는 쉽게 구할 수 있을 것입니다.

2. 나눌 수 없는 경우 (base case)


(r, c) 위치의 탐색 순서를 반환합니다.






* 나의 코드


https://github.com/stack07142/BOJ/blob/master/BOJ%231074/src/Main.java



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

int N = Integer.parseInt(st.nextToken());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());

int unitSize = (int) Math.pow(2, N - 1);

System.out.println(solve(unitSize, r, c));
}

static int solve(int size, int r, int c) {

// Base Case (더이상 나눌 수 없는 경우)
if (size <= 1) {

return (r * 2) + c;
}
// 나눌 수 있는 경우
else {

// divide & merge
// 위치 확인

return ((r / size) * 2 * size * size) + ((c / size) * size * size) + solve(size / 2, r % size, c % size);
}
}
}


'Algorithm > 분할정복' 카테고리의 다른 글

BOJ#1992 쿼드트리  (0) 2017.08.25
BOJ#11729 하노이 탑 이동 순서  (0) 2017.05.09