프렌즈4블록

개발새발log·2023년 1월 7일
0

Programmers

목록 보기
29/35

문제

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

접근 방식 && 코드

	1. 2 * 2 일치하는 블록 찾아서 표시한다('0')
	2. '0' 개수 세서 update
	3. 블록 떨구기 
		- 역순으로 리스트에 담은 뒤 재배치해서 return
        

탐색해서 찾고 표시하고, 또 떨구고하면서 board를 너무 많이 건든다는 생각이 들어서 개인적으로 1, 3의 과정을 번거롭게 짰다는 생각이 듦

  • 소스
def color_four_blocks(m, n, board):
    # 위치 확인 먼저, (시작점 기준으로 기록)
    to_color = []
    for i in range(m - 1):
        for j in range(n - 1):
            if board[i][j] is None:
                continue
            if board[i][j] == board[i][j + 1] == board[i + 1][j] == board[i + 1][j + 1] != '0':
                to_color.append([i, j])
    # 후 색칠
    for i, j in to_color:
        board[i][j] = board[i][j + 1] = board[i + 1][j] = board[i + 1][j + 1] = '0'


def blocks_fall(m, n, board):
    # 역순으로 리스트 담아서
    blocks = []
    for j in range(n):
        tmp = []
        for i in range(m - 1, -1, -1):
            if board[i][j] != '0':
                tmp.append(board[i][j])
        blocks.append(tmp)
    # transpose 해서 반환하기
    fallen = [[None] * n for _ in range(m)]
    for j in range(n):
        for cur, i in enumerate(range(m - 1, -1, -1)):
            if cur < len(blocks[j]):
                fallen[i][j] = blocks[j][cur]
    return fallen


def solution(m, n, board):
    res = 0
    board = [list(row[:]) for row in board]
    while True:
        color_four_blocks(m, n, board)  # '0' 색칠
        zero_count = sum(row.count('0') for row in board)  # '0' 개수 세서 update
        if zero_count == 0:
            break
        res += zero_count
        board = blocks_fall(m, n, board)  # 블록 떨어지기
        print(board)

    return res
profile
⚠️ 주인장의 머릿속을 닮아 두서 없음 주의 ⚠️

0개의 댓글