풀이방법
먼저 맵의 사이즈를 2 의 n승으로 계산한후
찾으려는 숫자의 R ,C, 맵 사이즈를 파라미터로 갖는 함수로 간다.
사이즈가 2인 사각형은 0,1 , 2 ,3 뿐이므로 그때마다 숫자를 더해주고 종료했고
그 이상의 사각형은 R ,C 에 따라 어떤 사분면에 위치하는지를 먼저 찾았다.
그리고 모든 사분면을 1사분면으로 크기를 절반씩 줄였다
그리고 대신에 그만큼의 값을 더해줬다.
package com.day11;
import java.util.Scanner;
public class BOJ1074_Z {
public static int N;
public static int r;
public static int c;
public static int mapSize;
public static int answer;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
r = sc.nextInt();
c = sc.nextInt();
mapSize = (int) Math.pow(2, N);
findNum(r,c,mapSize);
sc.close();
}
private static void findNum(int x, int y , int size) {
//사이즈가 2인 사각형까지 왔으면 위치에 따라 값 추가하고 리턴
if(size ==2) {
if(x==0 && y==0) {
System.out.println(answer);
return;
}
else if(x==0 && y==1) {
System.out.println(answer +1);
return;
}
else if(x==1 && y==0) {
System.out.println(answer +2);
return;
}
else if(x==1 && y==1){
System.out.println(answer +3);
return;
}
}
//사이즈가 2이상인 사각형이면 어떤 사분면에 위치하는지에 따라 값 다름
else {
if(x >= size/2) {
//4 사분면
if(y >=size/2) {
answer += ((size*size)/4) *3;
findNum(x-(size/2),y-(size/2), size/2);
}
//3 사분면
else {
answer += ((size*size)/4) *2;
findNum(x-(size/2),y, size/2);
}
}
else {
//2사분면
if(y >=size/2) {
answer += ((size*size)/4) ;
findNum(x,y-(size/2), size/2);
}
//1사분면
else findNum(x,y, size/2);
}
}
}
}