프로그래머스 : 2018 KAKAO BLIND RECRUITMENT [1차] 프렌즈4블록

2021. 10. 29. 15:30문제풀기/프로그래머스

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

 

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

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

programmers.co.kr

최근에 본 코딩테스트에서 거의 동일한 문제를 푼 적이 있다. 근데 어딘지 기억이 안남.....

 

이런 문제의 경우 여러 함수로 기능을 나눠서 구현하는 것이 디버깅하기도 편하고, 코드 고치기도 편하다.

아직 함수 이름을 어떻게 지어야 좋은지를 잘 모르겠지만...

  • check_erase : 지울게 있는지 확인 후, 지울 게 있다면 2*2 부분의 가장 위, 가장 왼쪽에 있는 블록의 위치를 넣은 result를 리턴한다.
  • erase_board : board 배열에서 erase_arr에 있는 2*2 부분의 시작점을 기준으로 4개 블록을 지운다. 이 때, 이미 지운 부분이 있을 수 있기 때문에 0인지 확인하고 count를 더해준다. 그리고 count를 리턴
  • rearrange_board : board 배열에서 중간중간 0으로 비어 있는 부분을 당겨준다.
def check_erase(m,n,board):
    result = []
    move = [(1,0),(0,1),(1,1)]
    
    for y in range(m):
        for x in range(n):
            
            if board[y][x] == 0:
                continue
                
            check = True
            
            for my,mx in move:
                dy = y+my
                dx = x+mx
                
                if dy>=m or dx>=n:
                    check = False
                    break
                    
                if board[y][x] != board[dy][dx]:
                    check = False
                    break
        
            if check == True:
                result.append((y,x))
                
    return result
            
def erase_board(m,n,board,erase_arr):
    move = [(0,0),(1,0),(0,1),(1,1)]
    count = 0
    
    for y,x in erase_arr:
        for my,mx in move:
            dy = y+my
            dx = x+mx
            
            if board[dy][dx] != 0:
                count += 1
                board[dy][dx] = 0
                
    return count
            
def rearrange_board(m,n,board):
    new_board = [[] for _ in range(n)]
    
    for x in range(n):
        for y in range(m-1,-1,-1):
            if board[y][x] != 0:
                new_board[x].append(board[y][x])

    board = [[0 for _ in range(n)] for _ in range(m)]

    for y in range(n):
        for x in range(len(new_board[y])):
            board[m-x-1][y] = new_board[y][x]

    return board


def solution(m, n, board):
    answer = 0

    board = list(map(list,board))
    
    while True:
        erase_arr = check_erase(m,n,board)
        if len(erase_arr) == 0:
            break
        answer += erase_board(m,n,board,erase_arr)
        board = rearrange_board(m,n,board)
    return answer