[프로그래머스] [1차] 프렌즈 4블럭

Narcoker·2023년 5월 10일
0

코딩테스트

목록 보기
96/150

문제

https://school.programmers.co.kr/learn/courses/30/lessons/17679

풀이

target(set)에 터질 블록의 위치를 저장한다.
target의 길이를 answer에 더한다.

만약 터질 블록이 없다면 종료한다.

터질 블록이 있다면 해당 블록을 " " 로 변경한다.

하단 줄부터 검색하면서 내려야 할 블록을 찾는다.
위에 줄부터 검색하면 내려할 할 블록의 맨아래만 내려간다.

내려할 블록의 아래 칸이 빈블록(" ")이라면 해당 값을 빈 블록의 위치로 옮기고
원래 블록 위치는 빈블록으로 만들어준다.

def solution(m, n, board):
    answer = 0
    for i in range(m):
        board[i] = list(board[i])
    dy = [0, 0, 1, 1]
    dx = [0, 1, 0, 1]

    while True:
        target = set()
        for row in range(0, m - 1):
            for col in range(0, n - 1):
                block = board[row][col] != " " \
                        and board[row][col] == board[row][col + 1] \
                        and board[row][col] == board[row + 1][col] \
                        and board[row][col] == board[row + 1][col + 1]

                if block:
                    for i in range(4):
                        ny = row + dy[i]
                        nx = col + dx[i]
                        target.add((ny, nx))
        if len(target) == 0:
            break

        answer += len(target)

        for row, col in target:
            board[row][col] = " "

        for row in range(m-2, -1, -1):
            for col in range(n):
                if board[row][col] != " ":
                    target_y = row
                    while target_y + 1 < m and board[target_y + 1][col] == " ":
                        board[target_y + 1][col] = board[target_y][col]
                        board[target_y][col] = " "
                        target_y += 1

    return answer
profile
열정, 끈기, 집념의 Frontend Developer

0개의 댓글