-
728x90
- answer {-1, 0, 1로 이루어진 종이 수를 저장 }
- 한 변의 길이를 N으로 하는 종이를 (1,1)부터 탐색 => search(시작r, 시작c, 한변길이N)
- 같은 숫자로 이루어졌는지 탐색 => checkNum(시작r, 시작c, 한변길이n)
(r, c) ~ (r+n-1, c+n-1)의 배열 안이 모두 같은 수로 이루어져있는지 검사
- pivot : 배열의 첫 좌표
: 배열 속 다른 값들이 모두 이 값과 같으면, 같은 수로 이루어진 종이임
- isSame : 같은 수로 이루어져 있으면 true, 아니면 false- checkNum이 true면, 같은 값으로 이루어져있는 종이이므로, answer[num+1]++
num = -1 이면, answer[0]++
num = 0 이면, answer[1]++
num = 1 이면, answer[2]++- 다른 값으로 이루어져있으면, 종이를 9등분하여 다시 탐색
- 한 변의 길이인 N을 N/3한 새로운 변의 길이를 newNum으로 한다.
- 탐색할 시작 점인 (r, c)는 아래 그림과 같이 한다.
search(r, c, newNum);
search(r, c + newNum, newNum);
search(r, c + 2 * newNum, newNum);
search(r + newNum, c, newNum);
search(r + newNum, c + newNum, newNum);
search(r + newNum, c + 2 * newNum, newNum);
search(r + 2 * newNum, c, newNum);
search(r + 2 * newNum, c + newNum, newNum);
search(r + 2 * newNum, c + 2 * newNum, newNum);import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class Main {static int N, paper[][], answer[];public static void main(String[] args) throws NumberFormatException, IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));N = Integer.parseInt(br.readLine());// 입력paper = new int[N + 1][N + 1];for (int i = 1; i <= N; i++) {StringTokenizer st = new StringTokenizer(br.readLine());for (int j = 1; j <= N; j++) {paper[i][j] = Integer.parseInt(st.nextToken());}}answer = new int[3]; // { -1, 0, 1로 채워진 수 개수 }search(1, 1, N);// -1, 0, 1로 이루어진 종이 수 출력StringBuilder sb = new StringBuilder();for (int i = 0; i < 3; i++)sb.append(answer[i] + "\n");System.out.println(sb.toString());}// 종이개수 구하기private static void search(int r, int c, int n) {if (n < 1) // 종료조건return;// 같은 숫자로 채워져있으면, 종이 개수 세기if (checkNum(r, c, n)) {int num = paper[r][c];answer[num + 1]++;return;}// 다른 숫자int newNum = n / 3;search(r, c, newNum);search(r, c + newNum, newNum);search(r, c + 2 * newNum, newNum);search(r + newNum, c, newNum);search(r + newNum, c + newNum, newNum);search(r + newNum, c + 2 * newNum, newNum);search(r + 2 * newNum, c, newNum);search(r + 2 * newNum, c + newNum, newNum);search(r + 2 * newNum, c + 2 * newNum, newNum);}// 같은 숫자로 채워져있는지 확인private static boolean checkNum(int r, int c, int n) {int nr = r + n - 1;int nc = c + n - 1;int pivot = paper[r][c]; // 첫 좌표 값을 기준으로하여 비교boolean isSame = true;for (int i = r; i <= nr && isSame; i++) {for (int j = c; j <= nc && isSame; j++) {if (pivot != paper[i][j]) // 하나라도 다르면 falseisSame = false;}}return isSame;}}데롱디롱희희.. (๑′ᴗ‵๑)
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[1747] 백준 - 소수&팰린드롬(JAVA) (0) 2021.10.19 [22944] 백준 - 죽음의 비(JAVA) (0) 2021.10.19 [1764] 백준 - 듣보잡(JAVA) (0) 2021.08.11 [1697] 백준 - 숨바꼭질(JAVA) (0) 2021.08.04 [1676] 백준 - 팩토리얼 0의 개수(JAVA) (0) 2021.08.04