네이버 블로그에서 velog로 옮긴 후 첫 포스팅 입니다.
이곳에서 확인 가능합니다.


우선 재귀함수 개념은 알고 있었으나, 강의를 듣고 제대로 풀려고 하니
대충 느낌은 이해 됐는데 뭔가 고안하는게 헷갈렸다.
우선
0 / 1
2 / 3
이게 반복 되는 구조이고, 원하는 위치가 정 사각형에서 몇 사분면에 있는지 반복하면서 체크하여
문제를 해결하였다.
package test11;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Ox11_Q1_1 {
static int cnt = 0;
// 백준 1074 S1 Z
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// n : 2의 n제곱만큼 보트 판크기
// r : r행 (가로)
// c : c행 (세료)
int n = Integer.parseInt(st.nextToken());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
// 기본적 보드판 생성
int boardLen = (int) Math.pow(2, n);
returnFunc(r,c,boardLen);
System.out.println(cnt);
}
public static void returnFunc(int r,int c, int boardLen) {
// boardLen ==1 -> 재귀 종료
if(boardLen ==1 ) {
return;
}
int temp = boardLen/2;
//해당 좌표가 왼쪽 위
if(r<temp && c<temp) {
returnFunc(r,c,temp);
}
// 해당 좌표가 오른쪽 위
else if(r<temp && temp<=c) {
cnt+= (int)Math.pow(temp,2);
returnFunc(r,c-temp,temp);
}
// 해당 좌표가 왼쪽 아래
else if(r>=temp && c < temp) {
cnt += (int)Math.pow(temp,2) * 2 ;
returnFunc(r-temp,c,temp);
}
// 해당 좌표가 오른쪽 아래
else {
cnt += (int)Math.pow(temp,2) * 3;
returnFunc(r-temp,c-temp,temp);
}
}
}
먼저 함수 returnFunc 는 r (행), c (열), boardLen (n의 길이)를 인자로 받는다.
우선, 전체 길이를 반복해서 1/4 해야하고, 전체 길이가 6이라 할때, 전체 길이의 반을 temp로 가정하겠다/
왼쪽 위는 0~3 / 0~3이므로 이는 temp로에 해당된다.
두 번째로, 오른쪽 위는 4~6 / 0~3 이므로, 이는 행은 그대로고 열만 반부터 진행되니깐
returnFunc(r,c-temp,temp) 를 return해준다.
세 번째로, 왼쪽 아래는 0~3 / 4~6 이므로, 이는 행은 반부터 진행되고, 열은 그대로니깐
return(r-temp,c,temp) 를 return 해준다.
마지막으로, 오른쪽 아래는 4~6 / 4~6 이므로, 이는 행도 반부터 진행하고, 열도 반부터 진행되므로
returnFunc(r-temp, c-temp, temp)를 return 해준다.
이 과정에서 전체 숫자를 의미하는 cnt는 제 1사분면일 땐 따로 더해주는게 없지만,
2, 3, 4일땐 temp의 제곱, 2 temp의 제곱, 3 temp의 제곱을 각각 더해주면서 값을 구해주었다.

굿