티끌모아 태산

백준 1074번: Z 본문

코딩/코딩테스트

백준 1074번: Z

yesman9 2024. 6. 4. 18:55

이 문제는 재귀적으로 호출하며 구역을 4등분 한다는 점에서 2630번: 색종이 만들기 문제와 비슷하다

위 문제를 풀었다면 재귀적 호출과 사분면에 따른 count 수만 잘 계산해주면 어렵지 않게 풀 수 있다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		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);

		bw.write(String.valueOf(count));
		bw.flush();
		bw.close();
	}

	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; // 1사분면 방문한 횟수 더하기
			find(size / 2, r, c - size / 2);
		} else if (r >= size / 2 && c < size / 2) {
			count += (size * size / 4) * 2; // 2사분면 방문한 횟수 더하기
			find(size / 2, r - size / 2, c);
		} else {
			count += (size * size / 4) * 3; // 3사분면 방문한 횟수 더하기
			find(size / 2, r - size / 2, c - size / 2);
		}
	}
}