문제
풀이(42분)
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 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());
int size = (int) Math.pow(2, N);
find(size, r, c);
System.out.println(count);
}
private static void find(int size, int r, int c) {
if(size == 1)
return;
if(r < size/2 && c < size/2) {
find(size/2, r, c);
}
else if(r < size/2 && c >= size/2) {
count += size * size / 4;
find(size/2, r, c - size/2);
}
else if(r >= size/2 && c < size/2) {
count += (size * size / 4) * 2;
find(size/2, r - size/2, c);
}
else {
count += (size * size / 4) * 3;
find(size/2, r - size/2, c - size/2);
}
}
}
초반 2진수로 접근을 하려고 했다. 물론 문제를 보자마자 재귀라는 것을 알았으나, 2의 배수를 다루며 반복적인 작업을 하기에 2진수로 접근할 수 있을 것이라고 생각했다.
00 | 01 |
10 | 11 |
0000 | 0001 | 0100 | 0101 |
0010 | 0011 | 0110 | 0111 |
1000 | 1001 | 1100 | 1101 |
1010 | 1011 | 1110 | 1111 |
문제가 확장될 때마다 앞에다가 00 / 01 / 10 / 11 만 추가해주면 된다는 것을 봤기 때문이다. 하지만 코드적 차원에서 접근이 이루어지지 않았고, 결과적으로 재귀를 통하여 문제를 해결했다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1484번. 다이어트(JAVA) (0) | 2024.11.28 |
---|---|
[백준] 14502번. 연구소(JAVA) (0) | 2024.11.28 |
[백준] 1520번. 내리막 길(JAVA) (1) | 2024.11.25 |
[백준] 2156번. 포도주 시식(JAVA) (1) | 2024.11.21 |
[백준] 4948번. 베르트랑 공준(JAVA) (0) | 2024.11.20 |