🕦 풀이시간 : 1시간
직전에 풀었던 쿼드트리와 정말 크게 다른 게 없었다.
그렇기 때문에
방법으로 진행했는데 이상하게 내가 원하는 값이 계속 안 찍혔다..
정말 정말 말도 안되게 바보 같았다.
입력 실수
이 전 코드에 입력 부분을 바로 가져와서 풀었는데 나중에 보니 입력 부분이 이미 blank가 포함되어 있었기 때문에 readline 후 split을 하던지 아니면 StringTokenizer를 이용하면 바로 풀리는 문제였는데 입력 부분에서 제대로 못 받았다는 생각을 안하고 풀었다..
효율적 코드
일단 문제를 해결하자는 마음가짐으로 접근을 하긴 했다만은 9분할에 있어 for문을 통해 효율적으로 코드를 짤 수도 있었다..반성하자
import java.io.*;
public class Main {
static int[][] paper;
static int[] papers = new int[3];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
paper = new int[N][N];
for(int i = 0; i < N; i++) {
String str = br.readLine();
for(int j = 0; j < N; j++) {
paper[i][j] = str.charAt(j) - '0';
}
}
getPapers(0,0,N);
for(int value : papers)
System.out.println(value);
}
private static void getPapers(int x, int y, int depth) {
//이건 하나가 다 통합 => 더하고 끝내자!
if(isOne(x,y,depth)){
if(paper[x][y] == -1)
papers[0]++;
else if(paper[x][y] == 0)
papers[1]++;
else if(paper[x][y] == 1)
papers[2]++;
return;
}
//9등분내고 다시 함수 호출!
getPapers(x,y,depth/3);
getPapers(x,y+depth/3,depth/3);
getPapers(x, 2 * (y+depth/3),depth/3);
getPapers(x+depth/3,y,depth/3);
getPapers(x+depth/3,y+depth/3,depth/3);
getPapers(x+depth/3, 2 * (y+depth/3),depth/3);
getPapers(x + 2 * (x+depth/3),y,depth/3);
getPapers(x + 2 * (x+depth/3),y+depth/3,depth/3);
getPapers(x + 2 * (x+depth/3), 2 * (y+depth/3),depth/3);
}
public static boolean isOne(int x, int y, int depth){
//모든 종이가 같은 수인가요?
for(int i = x; i < x+depth; i++){
for(int j = y; j < y+depth; j++){
if(paper[x][y] != paper[i][j])
return false;
}
}
return true;
}
}
import java.io.*;
public class Main {
static int[][] paper;
static int[] papers = new int[3];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
paper = new int[N][N];
for(int i = 0; i < N; i++) {
String[] input = br.readLine().split(" ");
for (int j = 0; j < N; j++) {
paper[i][j] = Integer.parseInt(input[j]);
}
}
getPapers(0,0,N);
for(int value : papers)
System.out.println(value);
}
private static void getPapers(int x, int y, int depth) {
// 모든 종이가 동일한 숫자로 채워져 있는 경우
if(isOne(x, y, depth)){
if(paper[x][y] == -1)
papers[0]++;
else if(paper[x][y] == 0)
papers[1]++;
else if(paper[x][y] == 1)
papers[2]++;
return;
}
int newDepth = depth / 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
getPapers(x + i * newDepth, y + j * newDepth, newDepth);
}
}
}
public static boolean isOne(int x, int y, int depth) {
// 모든 종이의 숫자가 동일한지 확인
int target = paper[x][y]; // 비교 대상 숫자를 가져옵니다.
for (int i = x; i < x + depth; i++) {
for (int j = y; j < y + depth; j++) {
if (paper[i][j] != target) // paper[i][j]를 비교 대상과 비교합니다.
return false;
}
}
return true;
}
}