[1차] 프렌즈4블록

송용진·2025년 4월 3일
0

알고리즘과 자료구조

목록 보기
184/190

게임 요구 사항을 구현해보는 문제입니다.
같은 모양의 카카오프렌즈 블록이 2x2 형태로 4개가 붙어있을 경우
사라지면서 점수를 얻는 게임인데요.
인접한 모든 블록이 사라지는 실제 게임들과 달리 계산을 쉽게 하기 위해
2x2로 제한하고,
사라진 블록 자리에는 새로운 블록이 채워지지 않습니다.
그럼에도 불구하고 인접한 블록을 모두 스캔해야 하는 문제라
짧지 않은 코드가 필요했을 것 같네요.
이번 시험에서 가장 긴 코드가 필요한 문제였습니다.
자바의 경우 무려 80라인이나 필요했네요.
블록 매트릭스를 생성하여 스캔하고 제거해 나가는 작업을 반복하면서
더 이상 제거되지 않을 때 사라진 블록 자리의 수를 계산하면 됩니다.

def solution(m,n,board):
    total_removed = 0
    while True:
        to_remove = set()
        
        # 2x2 블록 탐색
        for i in range(m - 1):
            for j in range(n - 1):
                # 같은 블록인지 확인
                if (board[i][j] != ' ' and
                    board[i][j] == board[i][j + 1] and
                    board[i][j] == board[i + 1][j] and
                    board[i][j] == board[i + 1][j + 1]):
                    to_remove.update([(i, j), (i, j + 1), (i + 1, j), (i + 1, j + 1)])
        
        # 지울 블록이 없으면 종료
        if not to_remove:
            break
        
        # 지우기
        total_removed += len(to_remove)
        for i, j in to_remove:
            board[i] = board[i][:j] + ' ' + board[i][j + 1:]
        
        # 아래로 떨어뜨리기
        for j in range(n):
            empty_row = m - 1
            for i in range(m - 1, -1, -1):
                if board[i][j] != ' ':
                    board[empty_row] = board[empty_row][:j] + board[i][j] + board[empty_row][j + 1:]
                    empty_row -= 1
            for i in range(empty_row, -1, -1):
                board[i] = board[i][:j] + ' ' + board[i][j + 1:]

    return total_removed
profile
개발자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN