[프로그래머스] 프렌즈4블록

joon_1592·2022년 5월 20일

알고리즘

목록 보기
43/51

시뮬레이션 구현 능력을 묻는 문제같아서 구현능력에 초점을 맞췄다.
블록의 크기가 최대 30x30밖에 안되어서 시간복잡도 신경쓰지 않았다.

  1. 4x4 블록에 모두 같은 프렌즈가 있으면 플래그 처리하기.
  2. 각 컬럼마다 플래그가 있는 프렌즈는 빼고 내리기
    2.1 프렌즈가 터져서(?) 빈 공간이 생기면 X 저장
  3. 프렌즈가 터지지 않으면(?) 반복문 종료
def is_same(items):
    item = items[0]
    if item == 'X':
        return False
    
    for x in items:
        if x != item:
            return False
    return True

def is_change(m, n, checker):
    for i in range(m):
        for j in range(n):
            if checker[i][j] == 1:
                return True
    return False
    

def check_friends(m, n, board):
    checker = [[0 for i in range(n)] for j in range(m)]
    for i in range(m - 1):
        for j in range(n - 1):
            items = []
            items.append(board[i][j])
            items.append(board[i][j+1])
            items.append(board[i+1][j])
            items.append(board[i+1][j+1])
            #print(items)
            if is_same(items):
                checker[i][j] = 1
                checker[i][j+1] = 1
                checker[i+1][j] = 1
                checker[i+1][j+1] = 1
    return checker

def show_board(m, n, board):
    for i in range(m):
        for j in range(n):
            print(board[i][j], end='')
        print()
    print()
    
def reset_column(m, n, board, checker):
    n_blocks = 0
    for j in range(n):
        col = []
        for i in range(m-1, -1, -1):
            if checker[i][j] == 0:
                col.append(board[i][j])
        
        # fill the column
        while len(col) < m:
            col.append('X')
            n_blocks += 1
        #print(col)
        # update board
        for i in range(m-1, -1, -1):
            board[i][j] = col[m-1-i]
    return n_blocks
        

def solution(m, n, board):
    answer = 0
    
    new_board = [[0 for i in range(n)] for j in range(m)]
    for i in range(m):
        for j in range(n):
            new_board[i][j] = board[i][j]
    
    while True:
        checker = check_friends(m, n, new_board)
        if not is_change(m, n, checker):
            break
        answer += reset_column(m, n, new_board, checker)
    
    #show_board(m, n, new_board)
    return answer
profile
공부용 벨로그

0개의 댓글