프로그래밍 대회

2630 색종이 만들기

Devops mg 2020. 2. 25. 14:08

나:

x,y 를 따로 다른 값을 증가 시켜줬는데, (코드가 더러워지고, 오래걸린다.)

 

다른 코드:

정사각형이라, length/2 로 잘라진 정사각형의 크기 만큼 증가 시켜주면 된다. 

1,2,3,4 블록을 나누는 패턴이 일정하다면 

len으로 함축해서 쓸수 있다. 

 

수정한 코드!


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

public class Main {
	static char [][]paper;
	static int cntB;// cntB (one)
	static int cntW;// cntW (zero) 
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int N= Integer.parseInt(bf.readLine());
		paper=new char[N+1][N+1];
		for (int i = 1; i <= N; i++) {
			st =new StringTokenizer(bf.readLine()," ");
			for (int j = 1; j <= N; j++) {
				paper[i][j]= st.nextToken().charAt(0);
			}
		}
	
		dfs(1,1,N);	// 재귀 dfs (범위 시작점, 끝점 )
	
		System.out.println(cntW);
		System.out.println(cntB);
		// 카운트
		
		
	}
	
	private static void dfs(int x,int y, int length) { // length/2
		char temp= paper[x][y];
		int  i;
		for (i = x; i < x+length; i++) {
			for (int j = y; j < y+length; j++) {// temp 보단 큼 
				if(temp!=paper[i][j]) { // 다른 색깔 존재 
					int len=length/2;
					dfs(x,y,len);
					dfs(x+len ,y,len); 
					dfs(x ,y+len,len); 
					dfs(x+len ,y+len,len); 
					return; // 뒤섞인 건 카운트 할필요 x 
				}
			}
		}
		if(i==x+length) { //다 돌았는데 다른게 없다. 
			if(temp=='1') { // 1 박스면 B 증가
				cntB++;
			}else {// 0 박스면 W 증가
				cntW++;
			}
		}
		
	
	}

}