Algorithm PS/Baekjoon Online Judge
[BOJ/백준] 1780 종이의 개수 (S2)
kyung.Kh
2024. 8. 9. 18:23
문제
https://www.acmicpc.net/problem/1780
풀이
색종이의 수가 모두 같은 수라면 이 색종이를 그대로 사용하지만 좌측의 그림과 같이 모두 같은 수가 아니라면 우측 그림처럼 9등분을 한다.
현재는 row와 column 모두 9이므로 9등분을 하면 나눠진 색종이의 size는 이전의 size/3이 되어 3이 된다.
나누어진 색종이를 좌표로 표현해보면 위와 같이 표현할 수 있다.
N이 9 일 때의 결과를 보면 위 그림과 같이 나오는 것을 알 수 있다.
Code
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int N;
static int [][] arr;
static int [] answer = new int[3]; // -1, 0, 1
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
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());
}
}
cut(0, 0, N);
for (int i = 0; i < 3; i++) {
bw.write(answer[i] + "\n");
}
bw.flush();
bw.close();
}
public static void cut(int x, int y, int size) {
// 다 같은 숫자면 더하기
if (numCheck(x, y, size)) {
if (arr[x][y] == -1) {
answer[0]++;
} else if (arr[x][y] == 0) {
answer[1]++;
} else {
answer[2]++;
}
} else { // check가 false면? (다른 숫자가 포함되어 있으면) -> 9분할 진행
int newSize = size / 3;
// 왼쪽 위부터 오른쪽 아래로 cut()를 진행하며 분할을 진행
cut(x, y, newSize); // 1
cut(x, y + newSize, newSize); // 2
cut(x, y + newSize * 2, newSize); // 3
cut(x + newSize, y, newSize); // 4
cut(x + newSize, y + newSize, newSize); // 5
cut(x + newSize, y + newSize * 2, newSize); // 6
cut(x + newSize * 2, y, newSize); // 7
cut(x + newSize * 2, y + newSize, newSize); // 8
cut(x + newSize * 2, y + newSize * 2, newSize); // 9
}
}
public static boolean numCheck(int x, int y, int size) {
int start = arr[x][y];
boolean check = true;
for (int i = x; i < x + size; i++) {
for (int j = y; j < y + size; j++) {
// start(시작점)와 각 칸에 표기된 수를 비교하여 다르면 false를 반환
if (start != arr[i][j]) {
check = false;
break;
}
}
}
return check;
}
}
728x90