본문 바로가기

Algorithm/Baekjoon Online Judge

[Java] BOJ1074_Z

www.acmicpc.net/problem/1074

 

1074번: Z

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

www.acmicpc.net


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

문제에 분할정복과 재귀의 힌트가 다 주어졌다. 배열의 크기가 최대 2^15 * 2^15 이므로 배열 전체를 탐색하면 당연히 시간초과가 난다.

 

import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int count = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int r = Integer.parseInt(st.nextToken()); //행
int c = Integer.parseInt(st.nextToken()); //열
func(r,c,1<<N, 0);
System.out.println(count);
}
public static void func(int r, int c, int n, int startnum) {
int temp = n/2*n/2;
if(r==0 && c==0) {
count = startnum;
return;
}
if(r < n/2 && c < n/2) { //1
func(r, c, n/2, startnum);
} else if(r < n/2 && c >= n/2) { //2
func(r, c-n/2, n/2, startnum+temp);
} else if(r >= n/2 && c < n/2) { //3
func(r-n/2, c, n/2, startnum+temp*2);
} else { //4
func(r-n/2, c-n/2, n/2, startnum+temp*3);
}
}
}

 

예제 입력 3 7 7 에서 63을 출력하기 위해

위와 같은 모습으로 3번만에 찾을 수 있다.

r과 c의 범위에 따라 어느 부분을 탐색해야할지를 잘 따져주면 쉽게 해결할 수 있다.

'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글

[Java] BOJ10844_쉬운 계단 수  (0) 2021.04.15
[Java] BOJ10836_여왕벌  (0) 2021.04.15
[Java] BOJ1068_트리  (0) 2021.04.15
[Java] BOJ10282_해킹  (0) 2021.04.15
[Java] BOJ2352_반도체 설계  (0) 2021.04.15