[백준] 2630번, 색종이 만들기
2021. 5. 17. 13:24ㆍ백준



접근법
- 분할 정복 기법 카테고리 문제를 골랐다. 분할 정복 기법을 사용하여야 된대서 어떤 식으로 풀어야 할지 고민을 하다가 다른 분들의 풀이법을 참고해가면서 풀었다.
- 생각보다는 특별한 기법없이 재귀를 사용하여 4 분할하는 방식으로 풀었다. 4 분할한 정사각형이 같은 색인지를 체크하고 같은 색이라면 해당 색에 +1, 다른 색이 하나라도 존재하면 그것을 다시 4 분할하는 방식으로 상당히 직관적인 풀이였다.
- white, blue 변수를 global로 선언해서 함수 내부에서 사용하게 하는 것만 주의하면 특별한 것은 없는 것 같다.
풀이
import sys
input = sys.stdin.readline
N = int(input())
paper = [list(map(int, input().split())) for _ in range(N)]
# N = 8
# paper = [[1, 1, 0, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0], [1, 0, 0, 0, 1, 1, 1, 1], [0, 1, 0, 0, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 1, 1]]
# white, blue = 0, 0
def color_check(i, j, n) :
for p in range(i, i + n) :
for q in range(j, j + n) :
if paper[p][q] != paper[i][j] :
return False
return True
def dnc(i, j, n) :
global white, blue
if color_check(i, j, n) :
if paper[i][j] == 1 :
blue += 1
else :
white += 1
return
else :
dnc(i, j, n // 2)
dnc(i + n // 2, j, n // 2)
dnc(i, j + n // 2, n // 2)
dnc(i + n // 2, j + n // 2, n // 2)
return
dnc(0, 0, N)
print(white)
print(blue)
결과

'백준' 카테고리의 다른 글
| [백준] 10815번, 숫자 카드 (0) | 2021.05.25 |
|---|---|
| [백준] 1992번 : 쿼드트리 (0) | 2021.05.17 |
| [백준] 2805번 : 나무 자르기 (0) | 2021.05.07 |
| [백준] 2206번 : 벽 부수고 이동하기 (0) | 2021.04.27 |
| [백준] 1697번 : 숨바꼭질 (0) | 2021.04.26 |