250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 주사위굴리기2
- 순열
- 완탐
- 백준
- 코테
- java
- BFS
- D드라이브생성
- 백준2251
- 중복조합
- 에라토스테네스의채
- 정보처리기사
- 파티션 크기 조정
- 자바
- 정올 1620
- 코테준비
- 삼성역테
- 알고리즘개념
- 재귀함수
- 중복순열
- N과M
- 백준15652
- 전화번호속의암호
- 완전탐색
- 백준13458
- 자바 코테
- 알고리즘
- 볼륨 만들기
- Bfs와DFS
- 23288
Archives
- Today
- Total
뚱땅뚱땅
[문제] 백준 1992번 쿼드트리 본문
728x90
* 출처: www.acmicpc.net/problem/1992
내 생각
1. 첫번째 풀이
배열을 계속해서 4등분 쪼개나가면 되므로 재귀로 풀었다.
종료 조건은 해당 영역이 0또는 1로 가득 채워있으면 된다.
그래서 종료 조건을 아래 3가지로 나눴다.
1. 배열의 크기가 1일 때
2. 1로 가득 찼을 때
3. 0으로 가득 찼을 때
가득 채운걸 확인하기 위해 메소드를 따로 만들었다.
시작하는 인덱스 위치와 배열의 크기를 인자로 받아 검사하도록 했다.
public class Main {
static StringBuilder sb = new StringBuilder();
static int N;
static int[][] matrix;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(in.readLine()); // matrix size
matrix = new int[N][N];
// init matrix
for (int i = 0; i < N; i++) {
String s = in.readLine();
for (int j = 0; j < N; j++) {
matrix[i][j] = s.charAt(j) - '0';
}
}
quad(0, 0, N);
// recursive function
System.out.print(sb);
}
//recursive func. size: 2의 제곱수
static void quad(int x, int y, int size) {
if (size == 1) {
if (matrix[x][y] == 1)
sb.append('1');
else if (matrix[x][y] == 0)
sb.append('0');
return;
}
if (isFullZero(x, y, size)) {
sb.append('0');
return;
}
if (isFullOne(x, y, size)) {
sb.append('1');
return;
}
sb.append('(');
int half = size/2;
quad(x,y,half);
quad(x, y+half,half);
quad(x+half,y,half);
quad(x+half,y+half, half);
sb.append(')');
}
// 해당 영역이 0으로 가득차면 true
static boolean isFullZero(int x, int y, int size) {
for (int i = x; i < x + size; i++) {
for (int j = y; j < y + size; j++) {
if (matrix[i][j] != 0)
return false;
}
}
return true;
}
// 해당 영역이 1으로 가득차면 true
static boolean isFullOne(int x, int y, int size) {
for (int i = x; i < x + size; i++) {
for (int j = y; j < y + size; j++) {
if (matrix[i][j] != 1)
return false;
}
}
return true;
}
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[문제] 백준 2493번 탑 (0) | 2021.02.04 |
---|---|
[문제] 백준 6603번 로또 (0) | 2021.02.04 |
[문제] 백준 15664번 N과 M(10) (0) | 2021.02.04 |
[문제] 백준 2231번 분해합 (0) | 2021.02.03 |
[문제] 백준 2798번 블랙잭 (0) | 2021.02.02 |
Comments