본문 바로가기

ALGORITHM

백준 1074 Z (Java)

1. 문제 링크

 

1074번: Z

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

분할정복의 대표적인 문제이다.

4개의 범위로 나눠서 각 범위 안에 들어왔을 때 재귀한다.

점점 작은 범위가 되고 값을 찾게 된다면 size가 1이 되면서 재귀가 끝난다.

 

4. 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	private static int visit, R, C;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] split = br.readLine().split(" ");
		int N = Integer.parseInt(split[0]);
		R = Integer.parseInt(split[1]);
		C = Integer.parseInt(split[2]);
		
		//2^N x 2^N 배열
		int num = (int)Math.pow(2, N);
		round(R, C, num);

		System.out.println(visit);
	}
	
	static void round(int r, int c, int size) {
		if(size == 1) {
			return;
		}
		
		int half = size/2;
		if(r<half && c<half) {
			round(r, c, half); 
		}
		else if(r<half && c>=half) {
			visit += half*half;
			round(r, c-half, half); 
		}
		else if(r>=half && c<half) {
			visit += half*half*2;
			round(r-half, c, half); 
		}
		else {
			visit += half*half*3;
			round(r-half, c-half, half); 
		}
	}
}