[programmers] 프렌즈4블록

resilient

·

2022. 2. 7. 13:06

728x90
반응형

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

 

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

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

programmers.co.kr

 

  • 이 문제는 조건에 따라 순서대로 구현하면 되는 문제입니다.
  • 먼저 2 x 2 총 4개의 블록이 같은 블록인지 확인해주고, 같은 블록이라면 삭제해주고, 삭제해준 빈 공간에 다른 블록들이 떨어지게 하는 함수 이렇게 총 3개의 함수로 나눠서 구현해줬습니다.
  • 주의할 점은 4개의 블록이 같은 블록인지 확인해주는 함수에서, 완전 탐색을 이용해서 현재 좌표의 블록, 그리고 아래, 오른쪽, 오른쪽 아래 대각선 블록을 확인해주는 방식으로 구현했는데, 중복되는 블록들이 있을 수 있습니다. 따라서 set함수를 이용해서 블록들이 중복되지 않게 구현했습니다.
  • 3개의 함수를 모두 구현한 뒤, while문으로 4개짜리 블록이(없앨 수 있는 블록이) 하나도 없고, 빈 자리를 채우기 위해 아래로 떨어질 블록들도 없다면, break 해서 갱신했던 answer를 return 했습니다.
  • 자세한 설명은 주석을 참고해주시면 감사하겠습니다.

 

                
def solution(m, n, board):
    answer = 0
    # 4개 모이는지 확인하는 함수
    def check(board):
        block = set()
        for i in range(m-1):
            for j in range(n-1):
                if board[i][j] and board[i][j] == board[i][j+1] == board[i+1][j] == board[i+1][j+1]:
                    block.update({(i,j),(i+1,j),(i+1,j+1),(i,j+1)})
        return block

    # 없앤 블록들 0으로 처리하는 함수    
    def remove(block,board):
        board = [list(r) for r in board]
        for blo in block:
            x,y = blo
            board[x][y] = ''
        return board
    
    # 내려보내는 함수
    def down(board):
        cnt = 0 
        # 처음에는 아래서 부터 고려했지만 
        # 다음과 같은 방법으로 서로 자리를 바꿔주면 아래로 내려보낼 수 있다.
        for i in range(m-1): 
            for j in range(n): 
                if board[i][j] and not board[i+1][j]: 
                    board[i][j], board[i+1][j] = board[i+1][j], board[i][j] 
                    cnt += 1 
        return cnt, board
    
    while 1:
        # 여기서 4개짜리 묶음이 하나도 없는지 체크해서 41번째줄에 전달
        block = check(board)
        answer += len(block)
        # 삭제
        board = remove(block,board)
        #while문을 돌리기위한 cnt = 1
        print(board)
        cnt = 1
        while cnt:
            # 내려보낸 결과 board 와 하나라도 내려갔는지 cnt를 return 받는다.
            cnt,board = down(board)
        if not cnt and not len(block):
            break
            
    return answer
반응형