728x90
https://www.acmicpc.net/problem/1780
1780번: 종이의 개수
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수
www.acmicpc.net
문제
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다.
- 만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다.
- (1)이 아닌 경우에는 종이를 같은 크기의 종이 9개로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다.
이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으로만 채워진 종이의 개수, 1로만 채워진 종이의 개수를 구해내는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ $3^7$, N은 $3^k$ 꼴)이 주어진다. 다음 N개의 줄에는 N개의 정수로 행렬이 주어진다.
출력
첫째 줄에 -1로만 채워진 종이의 개수를, 둘째 줄에 0으로만 채워진 종이의 개수를, 셋째 줄에 1로만 채워진 종이의 개수를 출력한다.
예제 입력 1
9
0 0 0 1 1 1 -1 -1 -1
0 0 0 1 1 1 -1 -1 -1
0 0 0 1 1 1 -1 -1 -1
1 1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0
0 1 -1 0 1 -1 0 1 -1
0 -1 1 0 1 -1 0 1 -1
0 1 -1 1 0 -1 0 1 -1
예제 출력 1
10
12
11
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[][] arr;
static int[] result = new int[3];
private static int cutting(int n, int startX, int startY) {
// 마지막까지 잘랐다면
if(n == 1) return arr[startX][startY];
// 9등분으로 자른 결과 배열에 넣기
int[] r = new int[9];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
r[3 * i + j] = cutting(n / 3, startX + (n / 3) * i, startY + (n / 3) * j);
}
}
for (int i = 1; i < 9; i++) {
if(r[i] != r[i - 1]) { // 다른 결과가 나왔다면
for (int j = 0; j < 9; j++) {
if(r[j] == -1) result[0]++;
else if(r[j] == 0) result[1]++;
else if(r[j] == 1) result[2]++;
}
return 2; // 다른 숫자가 채워졌다는 의미로 2 리턴
}
}
// 리턴하지 않고 for문을 나온 것은 종이가 같은 수로 채워졌다는 뜻
return r[0]; // 종이가 어떤 수로 채워졌는지 리턴
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
// 입력
N = Integer.parseInt(br.readLine());
arr = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
int r = cutting(N, 0, 0);
if(r == -1) result[0]++;
else if(r == 0) result[1]++;
else if(r == 1) result[2]++;
// 답 담기
for (int i : result) {
sb.append(i + "\n");
}
// 출력
System.out.println(sb);
}
}728x90
'Problem Solving > BOJ' 카테고리의 다른 글
| [백준, BOJ 5430] AC (java) (0) | 2023.03.12 |
|---|---|
| [백준, BOJ 2667] 단지번호붙이기 (java) (0) | 2023.03.11 |
| [백준, BOJ 1541] 잃어버린 괄호(java) (0) | 2023.03.11 |
| [백준, BOJ 1107] 리모컨 (java) (0) | 2023.03.11 |
| [백준, BOJ 11724] 연결 요소의 개수 (java) (0) | 2023.03.11 |