[ BOJ / Python ] 16768번 Mooyo Mooyo

황승환·2022년 7월 26일
0

Python

목록 보기
396/498


이번 문제는 BFS를 통해 해결하였다. 현재 좌표와 연결된 좌표 중 같은 값들을 가지는 좌표들을 찾아 이 좌표들의 개수가 k 이상일 경우 이 값들을 없애고, 밑으로 쌓는 문제로, BFS를 통해 각 칸들의 방문처리 여부를 확인하며 탐색하여 해결하였다.

Code

import copy
from collections import deque
n, k = map(int, input().split())
grid = [list(str(input())) for _ in range(n)]
dy, dx = [0, 1, 0, -1], [1, 0, -1, 0]
def bfs(y, x):
    q = deque()
    q.append((y, x))
    visited[y][x] = True
    path = [(y, x)]
    while q:
        y, x = q.popleft()
        for i in range(4):
            ny, nx = y+dy[i], x+dx[i]
            if 0 <= ny < n and 0 <= nx < 10 and not visited[ny][nx] and grid[ny][nx] == grid[y][x]:
                visited[ny][nx] = True
                path.append((ny, nx))
                q.append((ny, nx))
    if len(path) >= k:
        for py, px in path:
            grid[py][px] = '0'
def drop_nums():
    global grid
    new_grid = [['0' for _ in range(10)] for _ in range(n)]
    for i in range(10):
        idx = n-1
        for j in range(n-1, -1, -1):
            if grid[j][i] != '0':
                new_grid[idx][i] = grid[j][i]
                idx -= 1
    grid = copy.deepcopy(new_grid)
while True:
    visited = [[False for _ in range(10)] for _ in range(n)]
    tmp = copy.deepcopy(grid)
    for i in range(n):
        for j in range(10):
            if grid[i][j] and not visited[i][j]:
                bfs(i, j)
    drop_nums()
    if tmp == grid:
        break
for i in range(n):
    print(''.join(grid[i]))

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글