본문 바로가기

코딩테스트/파이썬

백준 11559번 Puyo Puyo

728x90

문제 설명

 

dx, dy는 상하좌우에 같은 색깔의 뿌요가 있는지 확인할 때 사용한다. refresh 함수는 뿌요가 터지고 뿌요들을 다시 아래로 떨어지게 하는 함수다. color 배열에 해당 열에 있는 모든 색들을 넣고 가장 아래서부터 차례대로 채워넣는다.

 

 

 

 

boom_count는 연쇄가 일어나는지 판별하기 위한 변수다. cur_color는 해당 위치의 뿌요의 색깔을 의미하고 color_count는 해당 뿌요와 같은 색깔의 뿌요의 갯수를 뜻한다. dfs를 사용하여 queue에 뿌요를 넣고 인접하는 같은 색깔의 뿌요를 same_color에 넣는다.

 

 

만약 인접한 같은 색깔의 뿌요가 3개 이상일 경우 boom_count를 1 더해주고 뿌요들을 . 으로 바꾼후 refresh 함수를 호출한다. 이중 for문을 돌린 후에도 boom_count가 0이면 연쇄할 뿌요가 없다는 뜻이므로 함수를 종료한다. 

 

 

전체 코드

board = []
dx = [-1,0,1,0]
dy = [0,1,0,-1]
answer = 0


def refresh():
    global board
    for j in range(6):
        colors = []
        for i in reversed(range(12)):
            if board[i][j] != '.':
                colors.append(board[i][j])
        i = 11
        for color in colors:
            board[i][j] = color
            i -= 1
        while i >= 0:
            board[i][j] = '.'
            i -= 1


def func(arr):
    global board
    global answer
    while True:
        boom_count = 0
        for i in range(12):
            for j in range(6):
                if arr[i][j] == '.':
                    continue
                cur_color = arr[i][j]
                color_count = 0
                queue = []
                same_color = []
                queue.append([i, j])
                same_color.append([i, j])
                while queue:
                    cur = queue.pop(0)
                    for k in range(4):
                        cur_x = cur[0] + dx[k]
                        cur_y = cur[1] + dy[k]
                        if cur_x < 0 or cur_x > 11 or cur_y < 0 or cur_y > 5:
                            continue
                        if arr[cur_x][cur_y] == '.':
                            continue
                        if [cur_x, cur_y] in same_color:
                            continue
                        if arr[cur_x][cur_y] == cur_color:
                            color_count += 1
                            queue.append([cur_x, cur_y])
                            same_color.append([cur_x, cur_y])
                if color_count >= 3:
                    boom_count += 1
                    for index in same_color:
                        arr[index[0]][index[1]] = '.'

        if boom_count == 0:
            break
        answer += 1
        refresh()
    return


def main():
    global board
    global answer
    for i in range(12):
        board.append(list(map(str,input())))
    func(board)
    print(answer)
    return

if __name__ == "__main__":
    main()
728x90
반응형

'코딩테스트 > 파이썬' 카테고리의 다른 글

백준 12891번 톱니바퀴  (0) 2021.02.11
백준 3190번 뱀  (0) 2021.02.11
백준 18808번 스티커 붙이기  (0) 2021.02.09
백준 12100번 2048(Easy)  (0) 2021.02.07
백준 15683번 감시  (0) 2021.02.06