728x90
문제
한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다.
N > 1인 경우, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다.
다음 예는 22 × 22 크기의 배열을 방문한 순서이다.
N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오.
다음은 N=3일 때의 예이다.
입력
첫째 줄에 정수 N, r, c가 주어진다.
출력
r행 c열을 몇 번째로 방문했는지 출력한다.
풀이
주어지는 n의 사이즈에 맞게 재귀호출로 한 사분면씩 나누어가면서 값을 찾는 문제이다.
else if 문을 사용하지 않으면 시간오류가 뜬다.
다른 말로하면 모든 크기를 검색하지 않고, 내가 찾는 위치에서 벗어난 사분면에 있으면 그 위치에 대해서는 정확한 위치를 알 필요가 없기에, 그 위치에서 더해지는 값만 return 하면 되는 것이다.
탐색을 시작하는 위치와 종료위치를 구하고 그 범위안에 내가 찾는 위치가 없으면 더해지는 cnt값만 구하고
그 범위 안에 있다면 탐색하면서 현재 위치가 내가 찾는 위치랑 동일하다면 cnt를 출력한다.
코드
import java.util.Scanner;
public class Main {
static int cnt = 0;
boolean chk = false;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), r = sc.nextInt(), c = sc.nextInt();
z(n, 0, 0, r, c);
}
public static void z(int n, int x, int y, int r, int c) {
if (x == r && y == c) {
System.out.println(cnt);
return;
}
if (n == 0)
cnt++;
else if (!(x <= r && r < x + (int) Math.pow(2, n) && y <= c && c < y + (int) Math.pow(2, n))) {
cnt += (int) Math.pow(2, n) * Math.pow(2, n);
return;
} else {
z(n - 1, x, y, r, c);
z(n - 1, x, (int) Math.pow(2, n - 1) + y, r, c);
z(n - 1, (int) Math.pow(2, n - 1) + x, y, r, c);
z(n - 1, (int) Math.pow(2, n - 1) + x, (int) Math.pow(2, n - 1) + y, r, c);
}
}
}
728x90
728x90
'Algorithm > Baekjoon' 카테고리의 다른 글
Baekjoon 11279 최대 힙 JAVA (0) | 2022.02.16 |
---|---|
Baekjoon 1927 최소 힙 JAVA (0) | 2022.02.16 |
Baekjoon 3040 백설 공주와 일곱 난쟁이 JAVA (0) | 2022.02.14 |
Baekjoon 2961 도영이가 만든 맛있는 음식 JAVA (0) | 2022.02.14 |
Baekjoon 20299 3대 측정JAVA (0) | 2022.02.14 |
댓글