본문 바로가기
백준

백준 2630번 : 색종이 만들기

by Huiyeong 2021. 3. 13.

 문제

www.acmicpc.net/problem/2630

 

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.

www.acmicpc.net

2630 색종이 만들기

 

 구현 방법

 전형적인 분할정복 문제입니다.

분할정복이란 그대로 해결할 수 없는 문제를 작은 문제로 분할하여 문제를 해결하는 방법이나 알고리즘입니다.

색종이의 맨 값을 저장해준 다음 탐색하면서 저장 값과 다르면 4등분으로 나눠줍니다.

이를 반복해줍니다.

 

 구현 코드

package BOJ.Silver;

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

public class B2630_색종이만들기 {
	static int N, blue, white;
	static int[][] arr;
	static boolean flag;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		arr = new int[N][N];
		for (int i=0;i<N;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j=0;j<N;j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		// 입력완료
		divide(0, 0, N);
		System.out.println(white+"\n"+blue);
	}
	
	static void divide(int r, int c, int length) {
		flag = false;
		int temp = arr[r][c]; // 처음 값 저장
		
		stop:for (int i=r;i<r+length;i++) {
			for (int j=c;j<c+length;j++) {
				if (arr[i][j]!=temp) { // 값이 다르다면
					flag = true;
					break stop;
				}
			}
		}
		if (!flag) { // 값이 같을 때
			if (temp==1) blue++;
			else white++;
			return;
		}
		if (flag) { // 값이 다를 때
			int size = length/2; // 길이를 반으로 나눠주고
			divide(r, c, size); // 좌측 위
			divide(r, c+size, size); // 우측 위
			divide(r+size, c, size); // 좌측 아래
			divide(r+size, c+size, size); // 우측 아래
		}
	}
}

 

정답!

 

'백준' 카테고리의 다른 글

백준 3187번 : 양치기 꿍  (0) 2021.03.14
백준 1926번 : 그림  (0) 2021.03.13
백준 2668번 : 숫자 고르기  (0) 2021.03.12
백준 2644번 : 촌수계산  (0) 2021.03.10
백준 3184번 : 양  (0) 2021.03.09