[Python] 프로그래머스 level2 [1차] 프렌즈4블록

mog·2020년 12월 11일
1

프로그래머스 level2. [1차] 프렌즈4블록

✨구현해야 하는 기능

구현해야 하는 기능을 아래와 같이 3개로 나누고 하나씩 구현하니까 코드가 더 간단하고 구현하기도 더 수월했다.

(1) 4개씩 붙어 원소 찾기

def check(m,n,board):
    isChange= False
    temp = [[0]*n for _ in range(m)]
    for i in range(1, m):
        for j in range(1, n):
            if board[i][j]== board[i-1][j] == board[i][j-1] ==board[i-1][j-1] != '0':
                isChange = True
                temp[i][j] = temp[i-1][j] = temp[i][j-1] = temp[i-1][j-1] =1
    return temp, isChange

isChange는 (3)에서 변화가 없으면 반복을 중단하기 위한 boolean값이다.

(2) (1)에서 찾은 값을 바탕으로 board 변경

def reboard(m ,n, board, temp):
    newboard = [['0']*n for _ in range(m)]
    cnt = 0
    for j in range(n):
        i = k = m-1
        while i >= 0:
            if temp[i][j] == 1:
                cnt += 1
                i -= 1
            else:
                newboard[k][j] = board[i][j]
                k -= 1
                i -= 1
    return newboard, cnt

cnt는 변경한 값이 몇 개인지 계산해서 answer에 더하기 위한 변수이다.

(3) (1)~(2)반복

변화가 없을 때 까지 (4개씩 붙어있는 같은 값이 없을 때 까지) (1)~(2)를 반복한다.

🎄 전체 코드

def check(m,n,board):
    isChange= False
    temp = [[0]*n for _ in range(m)]
    for i in range(1, m):
        for j in range(1, n):
            if board[i][j]== board[i-1][j] == board[i][j-1] ==board[i-1][j-1] != '0':
                isChange = True
                temp[i][j] = temp[i-1][j] = temp[i][j-1] = temp[i-1][j-1] =1
    return temp, isChange

def reboard(m ,n, board, temp):
    newboard = [['0']*n for _ in range(m)]
    cnt = 0
    for j in range(n):
        i = k = m-1
        while i >= 0:
            if temp[i][j] == 1:
                cnt += 1
                i -= 1
            else:
                newboard[k][j] = board[i][j]
                k -= 1
                i -= 1
    return newboard, cnt

def solution(m, n, board):
    board = list(map(list, board))
    answer = 0
    isChange = True
    while isChange:
        temp, isChange = check(m ,n, board)            
        board, cnt = reboard(m ,n, board, temp)
        answer += cnt
    return answer

0개의 댓글