비버놀로지

[BAEKJOON 백준] 1074 Z 본문

ALGORITM/JAVA

[BAEKJOON 백준] 1074 Z

KUNDUZ 2021. 1. 10. 14:56
728x90

www.acmicpc.net/problem/1074

 

1074번: Z

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

www.acmicpc.net

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

만약, N > 1이 라서 왼쪽 위에 있는 칸이 하나가 아니라면, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다.

다음 예는 22 × 22 크기의 배열을 방문한 순서이다.

 

N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오.

다음은 N=3일 때의 예이다.

 

 

위와같이 N=2 r=3 c=1 로 입력이 들어간다. N은 배열의 크기로 2^N의 배열이 들어간다. 그렇게 만들어진 배열에서 3행 1열에 방문하게되는 횟수를 출력해 줘야한다.

 

그런데 방문하는 방식이 Z라는 모양으로 방문해야 하는데, 재귀 방식을 이용을 해서 만들어 준다.

배열을 반씩 나누어 배열이 2*2가 되었을 때 값을 입력값과 위치가 같아진다면 그때의 값을 출력해 준다.

import java.util.Scanner;

public class Main {
	
    public static int row;
    public static int col;
    
    public static int[] dx = {0, 0, 1, 1};
    public static int[] dy = {0, 1, 0, 1};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int pow = sc.nextInt();
        
        int size = (int) Math.pow(2, pow);
        
        row = sc.nextInt();
        col = sc.nextInt();
        
        find(0, 0, 0, size);
        
        sc.close();
        
    }
    
    public static void find(int x,int y, int cnt, int size) {
        // 확인하고자 하는 row와 col 좌표가 y <= row < y+size, x <= col < x+size 범위 에 해당되지 않으면 구할 필요 없다. 
        if(x > row || x+size <= row || y > col || y+size <= col) return;
        
        if(size == 2) {
            
            for(int i=0; i < 4; i++) {
            	int xx = dx[i] + x;
                int yy = dy[i] + y;
                
                if(xx == row && yy == col) System.out.println(cnt + i);
            }
            return;
        }
        
        int newSize = size/2;
        
        find(x,y, cnt, newSize);
        
        find(x, y+newSize, cnt+(newSize*newSize), newSize);
        
        find(x+newSize, y, cnt+(newSize*newSize*2), newSize);
        
        find(x+newSize, y+newSize, cnt+(newSize*newSize*3), newSize);
    }
}
728x90

'ALGORITM > JAVA' 카테고리의 다른 글

[BAEKJOON 백준] 1157 단어 공부  (0) 2021.01.10
[BAEKJOON 백준] 1110 더하기 사이클  (0) 2021.01.10
[BAEKJOON 백준] 1032 명령 프롬프트  (0) 2021.01.10
[BAEKJOON 백준] 1008 A/B  (0) 2021.01.10
[BAEKJOON 백준] 1001 A-B  (0) 2021.01.10
Comments