백준 1074번 Z

민성재·2021년 8월 19일
0

Algorithm & Coding Test

목록 보기
19/20

풀이방법

먼저 맵의 사이즈를 2 의 n승으로 계산한후
찾으려는 숫자의 R ,C, 맵 사이즈를 파라미터로 갖는 함수로 간다.

사이즈가 2인 사각형은 0,1 , 2 ,3 뿐이므로 그때마다 숫자를 더해주고 종료했고

그 이상의 사각형은 R ,C 에 따라 어떤 사분면에 위치하는지를 먼저 찾았다.

그리고 모든 사분면을 1사분면으로 크기를 절반씩 줄였다
그리고 대신에 그만큼의 값을 더해줬다.

package com.day11;

import java.util.Scanner;

public class BOJ1074_Z {
	public static int N;
	public static int r;
	public static int c;
	public static int mapSize;
	public static int answer;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		r = sc.nextInt();
		c = sc.nextInt();

		mapSize = (int) Math.pow(2, N);
		findNum(r,c,mapSize);
		sc.close();
	}

	private static void findNum(int x, int y , int size) {
		//사이즈가 2인 사각형까지 왔으면 위치에 따라 값 추가하고 리턴
		if(size ==2) {
			if(x==0 && y==0) {
				System.out.println(answer);
				return;
			}
			else if(x==0 && y==1) {
				System.out.println(answer +1);
				return;
			}
			else if(x==1 && y==0) {
				System.out.println(answer +2);
				return;
			}
			else if(x==1 && y==1){
				System.out.println(answer +3);
				return;
			}
		}
		//사이즈가 2이상인 사각형이면 어떤 사분면에 위치하는지에 따라 값 다름
		else {
			if(x >= size/2) {
				//4 사분면
				if(y >=size/2) {
					answer += ((size*size)/4) *3;
					findNum(x-(size/2),y-(size/2), size/2);
				}
				//3 사분면
				else {
					answer += ((size*size)/4) *2;
					findNum(x-(size/2),y, size/2);
				}
			}
			else {
				//2사분면
				if(y >=size/2) {
					answer += ((size*size)/4) ;
					findNum(x,y-(size/2), size/2);
				}
				//1사분면
				else findNum(x,y, size/2);
			}
		}
	}
}
profile
민성재 개발 블로그

0개의 댓글