블로그 이름 뭐로 하지

[알고리즘/파이썬] 프로그래머스 - 프렌즈4블록 본문

알고리즘

[알고리즘/파이썬] 프로그래머스 - 프렌즈4블록

발등이 따뜻한 사람 2024. 1. 21. 20:30

문제

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

 

프로그래머스

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

programmers.co.kr

 

풀이

2018 카카오 문제...! 확실히 이 때는 시뮬이나 그래프 문제들이 많이 나왔던 것 같다. 지금은... 더보기

삼성 기출 풀어본 사람 특: 이런 구현 문제 되게 좋아함

하라는대로 하면 된다.

2*2 같은 거 있으면 체크해주고 한 번에 0으로 바꿔준다.

down 함수를 통해서 빈 공간을 채우기 위해 위에 떠있는 아이들을 내려준다.

 

 

코드

from collections import deque
def solution(m, n, board):
    answer = 0
    
    for i in range(len(board)):
        tmp_list = [a for a in board[i]]
        board[i] = tmp_list
    
    def down(board):
        for i in range(n):
            for j in range(m-1,-1,-1):
                if board[j][i] == 0:
                    tmp_j = j
                    while True:
                        tmp_j -= 1
                        
                        if tmp_j < 0:
                            break
                            
                        if board[tmp_j][i] != 0:
                            board[j][i] = board[tmp_j][i]
                            board[tmp_j][i] = 0
                            break  
                            

    while True:
        q = deque()
        flag = 0
        
        for i in range(m-1):
            for j in range(n-1):
                a,b,c,d = board[i][j],board[i+1][j],board[i+1][j+1],board[i][j+1]
                if a==b and b==c and c==d and a!=0:
                    flag = 1
                    q.append((i,j))
                    q.append((i+1,j+1))
                    q.append((i+1,j))
                    q.append((i,j+1))
                    
                    
        if flag == 0:
            break
        
        while q:
            x,y = q.pop()
            
            if board[x][y] != 0:
                board[x][y] = 0
                answer += 1
            
        down(board)

    return answer