비버놀로지

[BAEKJOON 백준] 1074 Z 본문

ALGORITM/JAVA

[BAEKJOON 백준] 1074 Z

KUNDUZ 2020. 8. 30. 20:00
728x90

https://www.acmicpc.net/problem/1074

 

1074번: Z

한수는 2차원 배열 (항상 2^N * 2^N 크기이다)을 Z모양으로 탐색하려고 한다. 예를 들어, 2*2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, 2차원 ��

www.acmicpc.net

Z 모양으로 순회하는 순서를 알아내는 문제입니다.

 

재귀를 이용하여 문제를 해결해야하는 문제입니다.

 

import java.util.Scanner;

public class Main {
	
	static int N,R,C;
	
	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in); //스캐너를 이용해 입력을 받아 줍니다.
		int n=sc.nextInt();
		N=(int) Math.pow(2,n);
		R=sc.nextInt(); //찾아야할 ROW 값
		C=sc.nextInt(); //찾아야할 COL 값
		
		solve(0,0,N); //메서드 호출
	}
	static int count;
	static boolean find;
	private static void solve(int row,int col,int size) {
		// TODO Auto-generated method stub
		if(size==2) { //배열의 크기가 2가 됬을때 R과 C가 있는지 찾아 줍니다.
			for(int i=row;i<row+2;i++) {
				for(int j=col;j<col+2;j++) {
					if(i==R&&j==C) { //배열안에서 찾았을 경우 find를 통해 찾았음을 알려줍니다.
						find=true;
						System.out.println(count);
						return;
					}
					count++;
				}
			}
			return;
		}
		int newsize=size/2;
		for(int i=0;i<2;i++) { //배열의 크기를 반으로 나누고, 재귀를 이용해 배열의 크기가 2가될때까지 나눠줍니다.
			for(int j=0;j<2;j++) {
				if(find) return; //만약에 찾았다면 재귀를 실행하지 않습니다.
				
				solve(row+newsize*i,col+newsize*j,newsize);
			}
		}
	}
}

 

 

728x90
Comments