Notice
Recent Posts
Recent Comments
Link
HwangHub
[자바/분할정복] 백준 1992. 쿼드트리 본문
문제
해석
이 문제는 대표적인 분할정복 문제다. 분할정복은 재귀를 이용하여 큰 문제를 작은 문제로 나눠서 해결하는 알고리즘이라고 한다. 이번에 학습하면서 연습문제 삼아 풀어봤다. 이것과 더불어 Z라는 문제도 유명하다.
나는 누적합을 같이 적용하여 풀었고, 기준에 미치지 못하면 재귀를 타고 들어가서 처리할 수 있도록 분할정복 로직을 구성하였다.
코드
public class BOJ_1992_쿼드트리 {
/*
* 실행시간 : 264 ms
*
* 메모리 : 17020 KB
* */
static int[][] ps;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[n][n];
ps = new int[n+1][n+1];
/* 배열 초기화 */
for (int i = 0; i < n; i++) {
String s = br.readLine();
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(s.substring(j,j+1));
}
}
/* 누적합 구하기 */
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
ps[i][j] = arr[i-1][j-1] + ps[i-1][j] + ps[i][j-1] - ps[i-1][j-1];
}
}
go(0, 0, n);
}
private static void go(int r, int c, int n) {
int res = ps[n+r][n+c] - ps[n+r][c] - ps[r][n+c] + ps[r][c];
if (res == n * n) {
System.out.print(1);
return;
} else if (res == 0) {
System.out.print(0);
return;
} else {
System.out.print("(");
n = n / 2;
go(r, c, n);
go(r, c + n, n);
go(r + n, c, n);
go(r + n, c + n, n);
System.out.print(")");
}
return;
}
}
'workspace > 알고리즘' 카테고리의 다른 글
[자바/Parametric-Search] 백준 2110. 공유기 설치 (1) | 2024.02.25 |
---|---|
[자바/유니온파인드] 백준 17471. 게리맨더링 (0) | 2024.02.22 |
[자바/그리디] 코드트리. 최대 숫자 만들기 (0) | 2024.02.13 |
[자바/그리디] 코드트리. 회의실 준비 구현 (1) | 2024.02.13 |
[자바/플로이드워셜] 코드트리. 행렬로 주어진 간선 (1) | 2024.02.13 |
Comments