몽상실현개발주의

[프로그래머스] level2 / 프렌즈 4블록 / Python 파이썬 본문

Algorithm PS/프로그래머스

[프로그래머스] level2 / 프렌즈 4블록 / Python 파이썬

migrationArc 2021. 6. 4. 11:52

[프로그래머스] level2 / 프렌즈 4블록 / Python 파이썬

[프로그래머스] level2 / 프렌즈 4블록 /  Python 파이썬

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

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr

 

풀이

주어진 조건과 과정을 수행하는 시뮬레이션 문제이다.

 

다음의 4가지 과정을 시행하여 문제를 해결하였다.

 

  1. 2× 2 형태로 4개가 붙어있는 블록을 찾는다.
  2. 찾은 블록들을 제거한다.
  3. 블록을 제거한 후, 위에 있는 블록을 아래로 떨어뜨려 빈 공간을 채운다.
  4. 더이상 블록이 제거되지 않으면, 지워진 블록의 개수를 세어준다.

 

# 입력된 board 를 2차원 배열로 변환
def makeBoard(m, board):
    newBoard = []
    for i in range(m):
        newBoard.append(list(map(str, board[i])))
    return newBoard

# 2 x 2 블록 탐색
def checkboard(m, n, board):
    deleteList = []
    for y in range(m-1):
        for x in range(n-1):
            if board[y][x] and board[y][x] == board[y][x+1] and board[y][x] == board[y+1][x] and board[y][x] == board[y+1][x+1]:
                deleteList.extend([[y, x], [y, x+1], [y+1, x], [y+1, x+1]])
    return deleteList

# 탐색된 2 x 2 블록을 제거 (0 으로 표기)
def deleteBlocks(board, deleteList):
    for d in deleteList:
        board[d[0]][d[1]] = 0
    return board

# 제거된 블록의 상단의 블록을 떨어뜨리기
def setBoard(m, n, board):
    for y in range(m-1, -1, -1):
        for x in range(n):
            if board[y][x]:
                continue
            nextY = y
            
            while nextY > 0:
                nextY -= 1
                if board[nextY][x]:
                    board[nextY][x], board[y][x] = board[y][x], board[nextY][x]
                    break
    return board

# 시뮬레이션 종료 후, 제거된 블록을 count
def countBoard(m, n, board):
    cnt = 0
    for y in range(m):
        for x in range(n):
            if not board[y][x]:
                cnt += 1
    return cnt


# 
def solution(m, n, board):
    board = makeBoard(m, board)
    
    while True:
        deleteList = checkboard(m, n, board)
        
        if not deleteList:
            break
        
        board = setBoard(m, n, deleteBlocks(board, deleteList))
    return countBoard(m, n, board)
Comments