백준 자바 1074 Z

김재동·2024년 7월 9일
1

문제

목록 보기
1/16

네이버 블로그에서 velog로 옮긴 후 첫 포스팅 입니다.

백준 자바 9466

이곳에서 확인 가능합니다.

우선 재귀함수 개념은 알고 있었으나, 강의를 듣고 제대로 풀려고 하니
대충 느낌은 이해 됐는데 뭔가 고안하는게 헷갈렸다.

우선

0 / 1
2 / 3

이게 반복 되는 구조이고, 원하는 위치가 정 사각형에서 몇 사분면에 있는지 반복하면서 체크하여
문제를 해결하였다.

package test11;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Ox11_Q1_1 {
	static int cnt = 0;
	// 백준 1074 S1 Z
	public static void main(String [] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		// n : 2의 n제곱만큼 보트 판크기
		// r : r행 (가로)
		// c : c행 (세료)
		int n = Integer.parseInt(st.nextToken());
		int r = Integer.parseInt(st.nextToken());
		int c = Integer.parseInt(st.nextToken());
		
		// 기본적 보드판 생성
		int boardLen = (int) Math.pow(2, n);
		returnFunc(r,c,boardLen);
		System.out.println(cnt);

	}

	
	public static void returnFunc(int r,int c, int boardLen) {
		
		
		// boardLen ==1 -> 재귀 종료
		if(boardLen ==1 ) {
			return;
		}
		
		int temp = boardLen/2;
		//해당 좌표가 왼쪽 위
		if(r<temp && c<temp) {
			returnFunc(r,c,temp);
		}
		
		// 해당 좌표가 오른쪽 위
		else if(r<temp && temp<=c) {
			cnt+= (int)Math.pow(temp,2);
			returnFunc(r,c-temp,temp);
		}
		
		// 해당 좌표가 왼쪽 아래
		else if(r>=temp && c < temp) {
			cnt += (int)Math.pow(temp,2) * 2 ;
			returnFunc(r-temp,c,temp);
		}
		
		// 해당 좌표가 오른쪽 아래
		else {
			cnt += (int)Math.pow(temp,2) * 3;
			returnFunc(r-temp,c-temp,temp);
			
		}
	}

}

먼저 함수 returnFunc 는 r (행), c (열), boardLen (n의 길이)를 인자로 받는다.

우선, 전체 길이를 반복해서 1/4 해야하고, 전체 길이가 6이라 할때, 전체 길이의 반을 temp로 가정하겠다/
왼쪽 위는 0~3 / 0~3이므로 이는 temp로에 해당된다.

두 번째로, 오른쪽 위는 4~6 / 0~3 이므로, 이는 행은 그대로고 열만 반부터 진행되니깐
returnFunc(r,c-temp,temp) 를 return해준다.

세 번째로, 왼쪽 아래는 0~3 / 4~6 이므로, 이는 행은 반부터 진행되고, 열은 그대로니깐
return(r-temp,c,temp) 를 return 해준다.

마지막으로, 오른쪽 아래는 4~6 / 4~6 이므로, 이는 행도 반부터 진행하고, 열도 반부터 진행되므로
returnFunc(r-temp, c-temp, temp)를 return 해준다.

이 과정에서 전체 숫자를 의미하는 cnt는 제 1사분면일 땐 따로 더해주는게 없지만,
2, 3, 4일땐 temp의 제곱, 2 temp의 제곱, 3 temp의 제곱을 각각 더해주면서 값을 구해주었다.

굿

profile
성장중

0개의 댓글