분할과 정복 문제에 약한 것 같다.
문제 이해는 되는데 코드로 구현하려면 머리가 멍~해져서 구글링..
여러 문제를 풀고, 좋은 풀이들을 보면서 익숙해지도록 반복해야겠다!
<while문을 이용한 풀이>
import java.io.*;
import java.util.*;
public class Main {
static int input[][];
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()); // 2^N 제곱
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int n = (int) Math.pow(2, N);
int cnt = 0;
int x = 0, y = 0;
while (n != 1) {
n /= 2;
if (r < x + n && c < y + n) { // 왼쪽 위
} else if (r < x + n && c >= y + n) { // 오른쪽 위
cnt += n * n;
y += n;
} else if (r >= x + n && c < y + n) { // 왼쪽 아래
cnt += n * n * 2;
x += n;
} else if (r >= x + n && c >= y + n) { // 오른쪽 아래
cnt += n * n * 3;
x += n;
y += n;
}
}
System.out.println(cnt);
br.close();
}
}
<재귀를 이용한 풀이>
import java.io.*;
import java.util.*;
public class Main {
static int input[][];
static int cnt, n, N, r, c;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 2^N 제곱
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
int n = (int) Math.pow(2, N);
cnt = 0;
dfs(n, 0, 0);
}
static void dfs(int n, int row, int col) {
if (n == 2) {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
int nr = row + i;
int nc = col + j;
if (nr == r && nc == c) {
System.out.println(cnt);
System.exit(0);
}
cnt++;
}
}
return;
}
dfs(n / 2, row, col);
dfs(n / 2, row, col + n / 2);
dfs(n / 2, row + n / 2, col);
dfs(n / 2, row + n / 2, col + n / 2);
}
}