공부공간

BOJ - 1780 ) 종이의 개수 본문

알고리즘/구현,시뮬

BOJ - 1780 ) 종이의 개수

개발자가될수있을까? 2022. 3. 9. 16:47

 


https://www.acmicpc.net/problem/1780

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수

www.acmicpc.net


현재 좌표와 길이를 변수로 재귀탐색을 하며, 모두 같은지 여부를 판단한다.

 

모두같은경우 -1 0 1 을 나누고

 

아닌경우 길이/3로 나누어서 재 탐색한다.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static int plus,zero,minus;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int map[][] = new int[N][N];
		for(int i=0;i<N;i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0;j<N;j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		go(0,0,N,map);
		System.out.println(minus+"\n"+zero+"\n"+plus);
	}
	private static void go(int y, int x, int len, int[][] map) {
		 int now = map[y][x];
		 boolean isAllsame = true;
		 top :
		 for(int i=y;i<y+len;i++) {
			 for(int j=x;j<x+len;j++) {
				 if(map[i][j]!=now) {
					 isAllsame =false;
				 } 
				 if(!isAllsame) {
					 break top;
				 }
			 }
		 }
		
		 
		 if(isAllsame) {
			 if(now==1)   plus++;
			 if(now==0)   zero++;
			 if(now==-1) minus++;
		 } else {
			 for(int i=y;i<y+len;i+=len/3) {
				 for(int j=x;j<x+len;j+=len/3) {
					 go(i,j,len/3,map);
				 }
		     }
		 }
		
	}

}

'알고리즘 > 구현,시뮬' 카테고리의 다른 글

BOJ - 2493 ) 탑  (0) 2022.05.11
BOJ - 21608 ) 상어 초등학교  (2) 2022.04.20
BOJ - 9375 ) 패션왕 신해빈  (0) 2022.03.07
BOJ - 5430 ) AC  (0) 2022.03.06
BOJ - 17219 ) 비밀번호찾기  (0) 2022.03.04
Comments