https://www.acmicpc.net/problem/2630
2 ** (m -1)과 2 ** m - 1을 헷갈려서 다소 얼탄 문제였다. 구상한 내용은 다음과 같다 :
- 시작하는 지점의 내용을 따로 기억해둬야한다. 이 내용은 코드에서 pivotValue 로 구현되었다.
- pivotValue와 다른 내용이 있는 경우가 있는지 주변 구역을 확인하다. 이 문제에서는 정사각형 단위로 끊어지게끔 구현되었다.
- 순회에서 바뀐 내용이 없는 경우 해당 구역은 pivotValue와 모두 동일한 내용이라고 간주 할 수 있다. 결과값을 갱신한다.
- for문에서 변동 내용이 감지 될 수 있다. 이 때 구역을 상세하게 나눠서 한 단계 깊은 재귀 함수가 실행된다.
- 여기서는 맨 윗 단계의 1-2를 반복한다.
lineLength = int(input())
field = [list(map(int,input().strip().split())) for _ in range(lineLength)]
colorCnt = [0, 0]
def func(m, x, y):
isDiff = False
pivotValue = field[x][y]
if(m == 0):
colorCnt[pivotValue] += 1
return
for i in range(x, x + (2 ** m)):
for j in range(y, y + (2 ** m)):
if(field[i][j] != pivotValue):
isDiff = True
if(isDiff):
break
if(isDiff):
break
if(isDiff):
func(m-1, x, y)
func(m-1, x + (2 ** (m - 1)), y)
func(m-1, x, y + (2 ** (m - 1)))
func(m-1, x + (2 ** (m - 1)), y + (2 ** (m - 1)))
else:
colorCnt[pivotValue] += 1
return
# input 구성하고, 제곱 수 만드는 방법 생각해두기
tmpVal = lineLength
multipleVal = 0
while tmpVal != 1:
multipleVal += 1
tmpVal = tmpVal // 2
func(multipleVal, 0, 0)
print(colorCnt[0])
print(colorCnt[1])
'문제풀이' 카테고리의 다른 글
[PY] 11503 : 가장 긴 증가하는 부분 수열 (0) | 2025.03.23 |
---|---|
[PY] 1629 : 곱셈 (0) | 2025.03.22 |
[PY] 2805 : 나무 자르기 (0) | 2025.03.21 |
[PY] 1920 : 수 찾기 (0) | 2025.03.21 |
[PY] 1914 : 하노이 탑 (0) | 2025.03.20 |