프로그래머스. 프렌즈 4블록

2024. 3. 28. 18:40코딩 테스트/프로그래머스

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

전체 코드

한승협님 코드 

def solution(m, n, board):
    cnt = 0
    board = [list(i) for i in board]
    
    while True:
        rem = set()
        
        # 제거할 타일을 rem 에 담는 과정
        for x in range(m-1):
            for y in range(n-1):
                if board[x][y] == board[x+1][y] == board[x][y+1] == board[x+1][y+1]:
                    if board[x][y] != "X":
                        rem.add((x,y))
                        rem.add((x+1,y))
                        rem.add((x,y+1))
                        rem.add((x+1,y+1))
                        
        # X 로 바꿈
        cnt += len(rem)
        for x, y in rem:
            board[x][y] = "X"
        
        # 아래 X 칸이 아닌 X 칸을 아래 칸과 맞바꿈
        while True:
            moved = 0
            for x in range(m-1):
                for y in range(n):
                    if board[x+1][y] == "X" and board[x][y] != "X":
                        board[x+1][y], board[x][y] = board[x][y], board[x+1][y]
                        moved += 1
            # X 칸을 다 내려줬다면 움직임이 없음
            if moved == 0:
                break
                
        # 제거할 칸이 없다면 나감
        if not rem:
            break
        
    return cnt