방명록
- [BOJ] 1074 : Z - java2024년 05월 21일 17시 01분 13초에 업로드 된 글입니다.작성자: hwangmono__o
문제
https://www.acmicpc.net/problem/1074
문제풀이
Z-order curve를 사용하여 2차원 공간에서 특정 위치를 찾는 문제이다. Z-order curve는 2차원 좌표를 재귀적으로 분할하여 각 분할 영역에 번호를 매기는 방식으로, 각 좌표의 비트를 번갈아가며 결합하여 1차원으로 정렬한다. 문제는 N x N (2^N x 2^N) 크기의 격자에서 Z-order를 따라 (r, c) 위치를 방문하는 순서를 찾는 것이다.
2^N x 2^N인 2차원 배열을 사분면으로 축소해 가며 (r, c)가 어느 작은 격자에 속하는지 재귀적으로 탐색을 한다.
x 좌표 : r >= x && r < x + len / y 좌표 : c >= y && c < y + len
위와 같은 조건으로 x = 0, y = 0의 값으로 시작해 재귀적으로 탐색을 하면 가작 작은 범위의 사분면부터 z모양으로 탐색을 하는 로직이다.
조건에 해당되지 않을 시 탐색한 사분면에 해당되지 않으니 넓이만큼 seq 값을 쌓는다.
탐색하는 (x,y) 값이 (r,c)와 같을 경우 쌓인 seq 값을 출력하고 종료한다.
소스코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class _1074 { static int N, r, c; static int seq = 0; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); r = Integer.parseInt(st.nextToken()); c = Integer.parseInt(st.nextToken()); z(0, 0, (int) Math.pow(2, N)); br.close(); } static void z(int x, int y, int len) { if (x == r && y == c) { System.out.println(seq); return; } if ((r >= x && r < x + len) && (c >= y && c < y + len)) { // x,y 좌표가 특정 사분면에 포함되는 경우 면적 축소 int nowLen = len / 2; z(x, y, nowLen); // 좌상단 z(x, y + nowLen, nowLen); // 우상단 z(x + nowLen, y, nowLen); // 좌하단 z(x + nowLen, y + nowLen, nowLen); // 우하단 } else { // x,y 좌표가 특정 사분면에 포함되지 않는 경우 해당 사분면 넓이만큼 축적 seq += (int) Math.pow(len, 2); } } }
etc
알고리즘이 분할 정복, 재귀로 분류된 문제였다. 재귀적 분할 정복 기법을 사용하여 시간 및 공간 복잡도에 대한 효율성 있게 활용할 수 있는 공부가 필요하다고 느꼈다.
Z-order 탐색 알고리즘
Z-order 탐색 알고리즘이란?Z-order 탐색 알고리즘은 Z-order curve를 사용하여 다차원 공간 데이터를 1차원으로 매핑하는 기법입니다. 이를 통해 공간 데이터를 효율적으로 검색하고 정렬
djun95.tistory.com
'Algorithm > 백준' 카테고리의 다른 글
[BOJ] 3019 : 테트리스 - java (0) 2024.06.21 [BOJ] 28702 : FizzBuzz - java (0) 2024.06.05 [BOJ] 30802 : 웰컴 키트 - java (0) 2024.06.05 [BOJ] 2659 : 십자카드 문제 - java (0) 2024.06.04 [BOJ] 15998 : 카카오머니 - java (1) 2024.05.16 다음글이 없습니다.이전글이 없습니다.댓글