알고리즘/백준
[백준] 1074번 : Z - 자바(JAVA)
Junuuu
2022. 3. 26. 00:01
반응형
https://www.acmicpc.net/problem/1074
1074번: Z
한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을
www.acmicpc.net
문제 해석
크기가 2^N x 2^N인 2차원 배열을 Z 모양으로 탐색하고자 합니다.
N > 1 인 경우 , 배열의 크기가 2^(N-1) x 2^(N-1)로 4등분 한 뒤에 재귀적으로 순서대로 방문합니다.
N=3일 때 예시
문제 풀이 전 설계
재귀 함수를 잘 작성해야 할 것 같다.
1. r x c 배열을 생성한 후 값을 0부터 하나씩 채워가기 -> array [r][c]의 값 출력
2. array[r][c] = 0으로 놓고 한 칸 이동시 -1 하면서 역추적 array [0][0]에 도달하면 Math.abs(값) 출력
배열에 값을 채워넣으려고 했지만 배열에 값을 넣게 되면 시간이 너무 오래 걸리고 메모리 초과가 나올 수 있습니다.
따라서 해당 보드의 사이즈를 구하고 사이즈를 기준으로 4사분면으로 나누어 줍니다.
그리고 해당 특정 분면에 도달하게 되면 보드의 size를 /2 하며 count를 증가시킵니다.
또한 r,c 의 위치를 조정해주고 다시 재귀적으로 호출하여 size=1일 때까지 반복하게 된다면
count를 구할 수 있습니다.
코드
package day0215;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_1074_Z {
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()); //열
int size = (int) Math.pow(2, N); //한 변의 사이즈
find(size, r, c);
System.out.println(count);
}
private static void find(int size, int r, int c) {
if(size == 1)
return;
//1사분면
if(r < size/2 && c < size/2) {
find(size/2, r, c);
}
//2사분면
else if(r < size/2 && c >= size/2) {
count += size * size / 4;
find(size/2, r, c - size/2);
}
//3사분면
else if(r >= size/2 && c < size/2) {
count += (size * size / 4) * 2;
find(size/2, r - size/2, c);
}
//4사분면
else {
count += (size * size / 4) * 3;
find(size/2, r - size/2, c - size/2);
}
}
}