Today's special moments become memories of tomorrow.

BOJ

[백준 2630번] 색종이 만들기 (java)

lotus lee 2021. 3. 9. 12:59

 

2630번: 색종이 만들기

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

www.acmicpc.net

 

색종이를 계속 4등분으로 분할하여 모두 같은 색으로 이루어졌는지 아닌지를 확인하는 문제.

분할을 하면서 동일한 로직을 반복하기 때문에 재귀를 이용하여 해결할 수 있다.

 

재귀 문제는 항상 base case 즉, 탈출 조건이 무엇인지를 확인해야 한다.

이 문제의 base case은 다음과 같다.

 

    1. 색종이의 크기가 1인 경우

       색종이의 크기가 1이면 더 이상 분할이 불가능하므로 재귀를 종료한다. 

    2. 색종이의 크기가 1보다 크지만, 모두 같은 색으로 이루어진 경우

       색종이가 모두 같은 색으로 이루어져 있으면 더 이상 색종이를 분할할 필요가 없다. 그 자체로

       흰색 색종이 혹은 파란 색종이 하나로 간주하기 때문이다. 그러므로 재귀를 종료한다.

 

색종이가 흰색과 파란색이 섞여 있으면 4등분으로 분할을 해야 한다.

색종이의 정보를 가장 왼쪽 위의 좌표(r, c)와 색종이 한 변의 길이(size)로 표현한다면,

이 색종이를 4분할로 분할하면 각각 4개의 분할된 색종이 정보는 아래와 같다.

 

가장 왼쪽 위 좌표 : (r, c) 한 변의 길이 : size/2

가장 왼쪽 위 좌표 : (r, c + size/2) 한 변의 길이 : size/2

가장 왼쪽 위 좌표 : (r + size/2, c) 한 변의 길이 : size/2

가장 왼쪽 위 좌표 : (r + size/2, c + size/2) 한 변의 길이 : size/2

 

총 4개로 분할되므로 재귀를 호출할 때 각 색종이 정보를 인자로 넣어주어서 총 4번 호출하면 된다.

반복문으로 재귀함수를 호출하는 부분은 다음과 같다.

	for (int i = r; i < r + size; i += size / 2) {
			for (int j = c; j < c + size; j += size / 2) {
				solve(i, j, size / 2);
			}
	}

 

소스코드 : 

 

 

'BOJ' 카테고리의 다른 글

[백준 1074번] Z (java)  (0) 2021.03.10
[백준 1208번] 부분수열의 합 2 (java)  (0) 2021.03.09
[백준 2263번] 트리의 순회 (java)  (3) 2021.03.09
[백준 1992번] 쿼드트리 (java)  (0) 2021.03.09
[백준 8983번] 사냥꾼 (java)  (0) 2021.03.08