[Problem Solving] 프렌즈4블록

Sean·2023년 10월 1일
0

Problem Solving

목록 보기
92/130

문제

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

풀이

아이디어

game 함수

  • 보드에서 2*2 범위 내에 값이 모두 같은 블록이(터졌다는 표시로 같은 것 빼고) 있고, 각 좌표가 exploded 리스트에 이미 포함되어 있지 않다면, exploded 리스트에 각각의 좌표를 추가해준다.
  • 각각의 좌표를 추가해줄때마다 ret를 1 증가시킨다.
  • 그렇게 모든 board를 돌고 나서, 터진 자리로 그 위에 있는 블록들을 끌어 내리는 작업을 수행한다. (while문으로 다 끌어당김) 이때 터진 자리는 -1로 표시한다.
  • 터진 블록의 총 개수인 ret을 return한다.

solution 함수

  • game 함수를 실행시킨 결과가 0일 때까지 계속 수행해서 answer에 game 함수의 return값을 더한다.

코드

def solution(m, n, board):
    board = [list(r) for r in board]
    answer = 0
    def game(m, n, board):
        exploded = []
        ret = 0
        for i in range(m-1):
            for j in range(n-1):
                ul = board[i][j]
                ur = board[i][j+1]
                dl = board[i+1][j]
                dr = board[i+1][j+1]
                if all((elem == ul and elem != -1) for elem in [ul, ur, dl, dr]):
                    if [i, j] not in exploded:
                        exploded.append([i, j])
                        ret += 1
                    if [i, j+1] not in exploded:
                        exploded.append([i, j+1])
                        ret += 1
                    if [i+1, j] not in exploded:
                        exploded.append([i+1, j])
                        ret += 1
                    if [i+1, j+1] not in exploded:
                        exploded.append([i+1, j+1])
                        ret += 1

        #위에 있던 것들을 아래로 내려보내는 과정
        for r, c in exploded:
            while r > 0:
                board[r][c] = board[r-1][c]
                board[r-1][c] = -1
                r -= 1
        return ret
    
    while True:
        found = game(m, n, board)
        if found == 0:
            break
        else:
            answer += found
    
    return answer
profile
여러 프로젝트보다 하나라도 제대로, 깔끔하게.

0개의 댓글