문제 링크 - https://www.acmicpc.net/problem/1780
🌱 문제
🌱 풀이
- 문제에서 제시한 그대로 과정을 코드로 나타내어서 풀었다.
- 한변의 길이가 size인 행렬에서 -1, 0, 1 의 수가 몇개인지 세어서 모두 같은수로 되어 있는지 아닌지 확인했다.
- 같은 수로 되어있으면 그 수에해당하는 answer에 1를 증가시켰고, 같은 수로 되어있지 않으면 9등분해서 재귀함수를 호출했다. 재귀함수 매겨변수로 다음 함수에서 확인할 종이의 시작좌표와 사이즈를 갱신해서 대입했다.
- 처음엔 9개의 함수를 다 작성할까 했는데, 이중 for문으로 더 간단하게 쓸 수 있을것같아서 그렇게 했다.
🌱 코드
package Sep_week04;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class boj_1780 {
static int answer1, answer2, answer3;
static int cnt1, cnt2, cnt3;
static int n;
static int arr[][];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
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());
}
}
func(0,0,n);
System.out.println(answer1);
System.out.println(answer2);
System.out.println(answer3);
}
public static void func(int r, int c, int size) {
if(size==1) {
if(arr[r][c]==-1) answer1++;
else if(arr[r][c]==0) answer2++;
else answer3++;
return;
}
cnt1=0; cnt2=0; cnt3=0;
for(int i=r; i<r+size; i++) {
for(int j=c; j<c+size; j++) {
if(arr[i][j]==-1) cnt1++;
else if(arr[i][j]==0) cnt2++;
else cnt3++;
}
}
int multi=size*size;
if(cnt1==multi || cnt2==multi || cnt3==multi) {
if(cnt1==multi) answer1++;
else if(cnt2==multi) answer2++;
else answer3++;
}else {
int newSize=size/3;
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
func(r+i*newSize, c+j*newSize, newSize);
}
}
}
}
}