Algorithm(CodeTree, Python)/DFS

[코드트리] 뿌요뿌요 Python

kurooru 2023. 2. 27. 17:19
# n 입력
n = int(input())
# grid
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]

# in_range(x, y)
def in_range(x, y):
    return 0 <= x < n and 0 <= y < n

# is_connected(x, y, curr_num)
def is_connected(x, y, curr_num):
    # 범위 내에 있고, 방문한 적 없으며, 같은 숫자면 가능
    return in_range(x, y) and not visited[x][y] and grid[x][y] == curr_num
    
# dfs(x, y)
def dfs(x, y):
    # 전역 변수 선언
    global curr_cnt

    # dxs, dys
    dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
    for dx, dy in zip(dxs, dys):
        nx, ny = x + dx, y + dy
        # 이어져 있으면
        if is_connected(nx, ny, grid[x][y]):
            # curr_cnt 올려주기 
            curr_cnt += 1
            # 방문 처리
            visited[nx][ny] = True
            # dfs
            dfs(nx, ny)

# 설계
# bomb_cnt, max_block
bomb_cnt, max_block = 0, 0

# visited
visited = [
    [False] * n
    for _ in range(n)
]

# grid를 돌면서
for i in range(n):
    for j in range(n):
        
        # 방문하지 않은 곳을 만나면
        if not visited[i][j]:
            # curr_cnt
            curr_cnt = 1

            # 방문 처리 후
            visited[i][j] = True
            # dfs -> curr_cnt 올려주기
            dfs(i, j)

            # curr_cnt가 4이상이면
            if curr_cnt >= 4:
                # bomb_cnt 올려주고
                bomb_cnt += 1
                
            # max_block update
            max_block = max(max_block, curr_cnt)

# 출력
print(bomb_cnt, max_block)