RegionsCutBySlashes

Published at 2021-11-26

class Solution:
    def regionsBySlashes(self, grid: List[str]) -> int:
        rowLen = len(grid)
        colLen = len(grid[0])
        regionCnt = 0
        # 한 칸을 3x3으로 나눠서 각 칸에 True 저장
        region = [([True] * 3) * rowLen for i in range(colLen * 3)]

        def doMark(row, col, n):  # n: col위치에 계속 +n할거임
            for i in range(3):
                region[row][col] = False
                col += n
                row += 1
            return

        # 1. 3x3으로 나눈걸 슬래시 정,역 에따라 True->False로 바꿈
        for i in range(rowLen):
            for j in range(colLen):
                if grid[i][j] == '/':
                    doMark(i * 3, (j * 3) + 2, -1)  # 시작 위치 전달
                elif grid[i][j] == '\':
                    doMark(i * 3, j * 3, 1)

        # print(region)

        # 사방확인. 연결된 True칸을 False로(중복 카운트 방지)
        def checkLegion(row, col):
            region[row][col] = False
            if region[row][max(0, col - 1)]: checkLegion(row, max(0, col - 1))  # 왼
            if region[min(len(region) - 1, row + 1)][col]: checkLegion(min(len(region) - 1, row + 1), col)  # 밑
            if region[row][min(len(region[0]) - 1, col + 1)]: checkLegion(row, min(len(region[0]) - 1, col + 1))  # 오
            if region[max(0, row - 1)][col]: checkLegion(max(0, row - 1), col)  # 위
            return

        # 2. True로만 묶인 구역 갯수 세기
        for i in range(rowLen * 3):
            for j in range(colLen * 3):
                if region[i][j]:
                    regionCnt += 1
                    checkLegion(i, j)

        return regionCnt