알고리즘/문제

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

_Min 2021. 5. 6. 14:23

문제링크 programmers.co.kr/learn/courses/30/lessons/17679

 

1. 전치행렬을 만들어주기 위해 list(map(list, zip(*board)))

1-1. list를 unpacking 하기 위해 *
1-2. zip()은 tuple을 반환하는데 tuple은 값 변경이 안 되니 list로 바꿔줌
1-3. map()은 주소값을 반환하기 때문에 list()로 묶어줌
2. 중복되는 원소를 넣지 않기 위해 set() / set.add()

 

 

[답코드]

import copy

def solution(m, n, board):
    answer = 0
    board = list(map(list, zip(*board))) #*는 리스트를 unpacking 한다
    
    while True:
        remove=set()
        for i in range(len(board)-1):
            for j in range(len(board[i])-1):
                if board[i][j]!='_' and board[i][j]==board[i+1][j]==board[i][j+1]==board[i+1][j+1]:
                    remove.add((i, j))
                    remove.add((i+1, j))
                    remove.add((i, j+1))
                    remove.add((i+1, j+1))
                    
        if not remove:
            break

        answer+=len(remove)

        for k in remove:
            i, j=k
            board[i][j]='_'

        for i in range(len(board)):
            front, back=[],[]
            for j in range(len(board[i])):
                if board[i][j]=='_':
                    front.append('_')
                else:
                    back.append(board[i][j])
            board[i]=front+back
    
    
    return answer
728x90