티스토리 뷰
https://www.acmicpc.net/problem/1780
문제
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다.
- 만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다.
- (1)이 아닌 경우에는 종이를 같은 크기의 종이 9개로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다.
이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으로만 채워진 종이의 개수, 1로만 채워진 종이의 개수를 구해내는 프로그램을 작성하시오.
코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
private static int zero = 0, one = 0, minus = 0;
private static int[][] board;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
board = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < n; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
partition(0, 0, n);
System.out.println(minus + "\n" + zero + "\n" + one);
br.close();
}
public static void partition(int row, int col, int size) {
if (check(row, col, size)) {
if(board[row][col] == -1) {
minus++;
}
else if(board[row][col] == 0) {
zero++;
}
else {
one++;
}
return;
}
int newSize = size / 3;
partition(row, col, newSize);
partition(row, col + newSize, newSize);
partition(row, col + 2 * newSize, newSize);
partition(row + newSize, col, newSize);
partition(row + newSize, col + newSize, newSize);
partition(row + newSize, col + 2 * newSize, newSize);
partition(row + 2 * newSize, col, newSize);
partition(row + 2 * newSize, col + newSize, newSize);
partition(row + 2 * newSize, col + 2 * newSize, newSize);
}
public static boolean check(int row, int col, int size) {
int color = board[row][col];
for (int i = row; i < row + size; i++) {
for (int j = col; j < col + size; j++) {
if (color != board[i][j]) {
return false;
}
}
}
return true;
}
}
풀이
분할 정복을 활용해 푼다. 9개로 나누어 각각 재귀호출을 수행하면 끝!
'학습 내용 > 백준 문제풀이' 카테고리의 다른 글
백준 11659 자바 - 구간 합 구하기 4 (0) | 2022.12.30 |
---|---|
백준 1074 자바 - Z (0) | 2022.12.27 |
백준 11728 자바 - 배열 합치기 (0) | 2022.11.10 |
백준 10816 자바 - 숫자 카드 2 (0) | 2022.11.09 |
백준 10815 자바 - 숫자 카드 (0) | 2022.11.01 |