프로그래머스/코딩테스트 Lv. 2

[1차] 프렌즈4블록 - Python(2018 KAKAO BLIND RECRUITMENT)

아몬드바 2023. 10. 12. 22:49
728x90

문제 설명


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

입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.

입력 형식
입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다.
2 ≦ n, m ≦ 30
board는 길이 n인 문자열 m개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.


출력 형식
입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.

입출력 예제

 

문제해결과정

1. 먼저 같은블럭 4개를 찾는것은 생각보다 쉬웠지만 블럭을 아래로 떨어뜨린다는것에 대해 너무 어렵게 느껴졌다..

2. 처음에는 루프한번 수행 시 제거하고 난 다음 배열에서 맨위 블럭이랑 현재 남아있는 블럭에 대해서 swap 하려고 했는데 빈공간이 생기면서 자꾸 에러가 났다.

3. 결국 힌트보고 함..하 


def solution(m, n, board):
    # m 은 판의 높이, 폭 n
    board = [list(i) for i in board]
    answer = 0
    # 중복제거 방지 set 사용
    clear = set()
    while True:
        for i in range(m - 1):
            for j in range(n - 1):
                # 자신, 오른쪽, 아래, 대각선 동시에 비교
                a, b, c, d = board[i][j], board[i + 1][j], board[i][j + 1], board[i + 1][j + 1]
                if a == b == c == d and a !=[]:
                    clear.add((i, j))
                    clear.add((i + 1, j))
                    clear.add((i, j + 1))
                    clear.add((i + 1, j + 1))

        if len(clear) == 0:
            break

        # 루프 끝날때마다 제거
        answer += len(clear)
        for i, j in clear:
            board[i][j] = []
        clear = set()
    
        #지워진 블럭들을 아래로 내리기
        while True :
            move = 0
            # 가장 마지막 행에서는 배열의 범위를 초과하므로 m - 1
            for i in range(m - 1):
                for j in range(n):
                    if board[i][j] != [] and board[i+1][j] == []:
                        board[i][j],board[i + 1][j] = board[i + 1][j],board[i][j]
                        move = 1
            if move == 0:
                break

    return answer
728x90