<Algorithm> 58. 1074번 Z
by BFine반응형
1. 1074번 Z
분할 정복 문제, 큰 배열을 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 51 52 53 54 55 56 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static int count = 0; public static void main(String[] args) throws NumberFormatException, 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()); div(N, r, c); System.out.println(count); } private static void div(int N, int r, int c) { if(N == 0) return; int n = (int)Math.pow(2, N); int quarter = n * n / 4; // 0 : 1분면, 4 : 2분면, 8 : 3분면, 12 : 4분면 // 각 분면의 시작 만큼 더해주고 분할하고 N이 0이될때까지 반복 // 0.0 부터 시작하기 떄문에 위쪽 왼쪽이 기준이 된다. if(r < n/2 && c < n/2) { // 1분면 div(N - 1, r, c); }else if(r >= n/2 && c < n/2) { // 3분면 count += quarter * 2; div(N - 1, r - n/2, c ); // 1분면으로 떙기기 }else if(r < n/2 && c >= n/2) { // 2분면 count += quarter; div(N - 1, r, c - n/2); // 1분면으로 떙기기 }else if(r >= n/2 && c >= n/2) { // 4분면 count += quarter * 3; div(N - 1, r - n/2, c - n/2); // 1분면으로 떙기기 } } } | cs |
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 60. 2042번 구간 합 구하기 (0) | 2018.08.21 |
---|---|
<Algorithm> 59. 11004번 K번째 수(Quick & Merge Sort) (0) | 2018.08.19 |
<Algorithm> 57. 10815번 숫자카드(BinarySearch) (0) | 2018.08.18 |
<Algorithm> 56. 2263번 트리의 순회 (0) | 2018.08.17 |
<Algorithm> 55. 1735번 분수 합(유클리드) (0) | 2018.08.16 |
블로그의 정보
57개월 BackEnd
BFine