Programming/Algorithm
[Java] 백준 1780 종이의 개수
Yejii
2021. 3. 5. 19:53
문제
잘라진 종이가 한 숫자로만 이루어져 있는지를 검사하고
그렇다면 종이 개수를 추가하고, 아니라면 9등분으로 나눠 다시 종이 내의 숫자를 검사하는 문제이다.
9등분으로 나누는 부분을 재귀로 처리하였다.
풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[][] map;
static int[] res;
public static void main(String[] args) throws IOException {
solution();
}
static void solution() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new int[N][N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
res = new int[3];
recursion(0, 0, N);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 3; i++) {
sb.append(res[i]).append("\n");
}
System.out.println(sb);
}
static void recursion(int x, int y, int len) {
boolean isSame = true;
int number = map[x][y];
loop:
for (int i = x; i < x + len; i++) {
for (int j = y; j < y + len; j++) {
if (map[i][j] != number) {
isSame = false;
break loop;
}
}
}
if (isSame) {
res[number + 1]++;
return;
}
int nlen = len / 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
recursion(x + i * nlen, y + j * nlen, nlen);
}
}
}
}
피드백
- 정사각형 형태이고 9등분으로 나누면 너비와 높이 모두 같은 비율로 줄어들기 때문에, nx와 ny를 굳이 나눠서 계산할 필요 없다. nlen = len/3으로 모두 처리 가능