알고리즘/분할정복(Divide and conquer)

[백준 1074] - [분할정복] - Z (JAVA)

팡스 2018. 11. 30. 12:04

문제 링크 : https://www.acmicpc.net/problem/1074




이 문제는 분할정복으로 쉽게 풀 수 있는 문제이다. 


그리고 배열을 만들필요가 없다. 

굳이 만들겠다면 확인해 보자 heap 메모리가 부족하다고 에러가 발생할것이다. 


입력값이 최대 값이 15 이다 이 15가 15 X 15 가 아니라 2의 15승이다 


2의 15승은 32,768이다. 

그럼 32,768 * 32,768 = 1,073,741,824


10억개 정도 나온다. 그럼 이것또한 무식하게 재귀로 풀것인가?? 그것또한 미친짓이다. 


이 문제의 정답 비율은 굉장히 높다.

그럼 쉽게 접근 할 수 있다는것이다. 



배열의 크기를 최소 사이즈인 2가 될때까지 계속 4등분을 하면서 입력받은 좌표가 범위 안에 있는 것들만 계산을 했다. 

8*8 배열에 (2, 5) 좌표의 방문 순서를 확인 하고자 할때 8*8 배열을 4등분 하고 

최소 사이즈가 됐을때 방문 횟수를 계산하는것으로 소스를 작성했다. 


       

 

        
        
        
        
        
        
        


소스


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
import java.util.Scanner;
 
public class Main {
    
    public static int row;
    public static int col;
    
    public static int[] dy = {0011};
    public static int[] dx = {0101};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int pow = sc.nextInt();
        
        int size = (int) Math.pow(2, pow);
        row = sc.nextInt();
        col = sc.nextInt();
        
        drawZ(000, size);
        
        sc.close();
        
        System.out.println(size*size);
    }
    
    public static void drawZ(int y, int x, int cnt, int size) {
        // 확인하고자 하는 row와 col 좌표가 y <= row < y+size, x <= col < x+size 범위 에 해당되지 않으면 구할 필요 없다. 
        if(y > row || y+size <= row || x > col || x+size <= col) return;
        
        if(size == 2) {
            
            for(int i=0; i < 4; i++) {
                int yy = dy[i] + y;
                int xx = dx[i] + x;
                
                if(yy == row && xx == col) System.out.println(cnt + i);
            }
            return;
        }
        
        int newSize = size/2;
        
        drawZ(y, x, cnt, newSize);
        
        drawZ(y, x+newSize, cnt+(newSize*newSize), newSize);
        
        drawZ(y+newSize, x, cnt+(newSize*newSize*2), newSize);
        
        drawZ(y+newSize, x+newSize, cnt+(newSize*newSize*3), newSize);
    }
}
cs