코딩테스트/백준

[Java] 백준 1074 : Z

플래시🦥 2023. 2. 15.
반응형
https://www.acmicpc.net/problem/1074
 

1074번: Z

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을

www.acmicpc.net


 

 2의 N제곱 사이즈의 배열에서 (r,c)을 몇번째로 방문했는지 묻는 문제이다.

 

 1. (r,c)의 위치를 구분했다.

z모양으로 움직이는 순서대로 왼쪽 위/ 오른쪽 위/왼쪽 아래/ 오른쪽아래 어디에 있는지 찾는다. 

 

2. 해당하는 위치에서 가장 앞에 있는 위치의 순서값을 cnt에 합한다. 

여기서 가장 앞에 위치한 것은 각 0, 4,8,12를 의미한다. 

 

3. 이 방법을 반복해서 작동하도록 재귀하여 함수를 호출한다. 

단, 호출해 줄때 r과 c의 위치를 (0,0)에서 시작한 것처럼 호출한다. 

예를 들어 위 그림에서 4의 위치는 (0,2)이었던 것을 호출할 때는 (0,0)으로 만들어 주는 것이다. 

각각을 또 다시 나누었을 때 위치를 파악하기 위함이다.

 


import java.util.*;


public class Main {

	static int N,r,c,cnt=0;
	
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		r = sc.nextInt();
		c = sc.nextInt();
		
		find(r,c,(int)Math.pow(2, N));
		System.out.println(cnt);
		
	
	}// main()
	
	static void find(int x,int y, int size) {
		if(size==1)
			return;
		
		if(x<size/2&&y<size/2) {	//왼쪽 위
			find(x,y,size/2);
		}else if(x<size/2&&size/2<=y) {	//오른쪽 위
			cnt+=(size*size/4);
			find(x,y-size/2,size/2);
		}else if(x>=size/2&&size/2>y) { //왼쪽 아래
			cnt+=(size*size/4)*2;
			find(x-size/2,y,size/2);
		}else {						//오른쪽 아래
			cnt+=(size*size/4)*3;
			find(x-size/2,y-size/2,size/2);
			
		}
			
	}
	
}// class Main
728x90
반응형

'코딩테스트 > 백준' 카테고리의 다른 글

[Java] 백준 11286 : 절대값 힙  (0) 2023.02.16
[Java] 백준 11403 : 경로 찾기  (0) 2023.02.15
[Java] 백준 1629 : 곱셈  (0) 2023.02.13
[Java] 백준 11057 : 오르막 수  (0) 2023.02.10
[Java] 백준 7526 : 나이트의 이동  (0) 2023.02.10

댓글