문제 풀이/백준

[백준] 1074번. Z(JAVA)

27200 2024. 11. 27. 20:05

문제


풀이(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 만 추가해주면 된다는 것을 봤기 때문이다. 하지만 코드적 차원에서 접근이 이루어지지 않았고, 결과적으로 재귀를 통하여 문제를 해결했다.