본문 바로가기

알고리즘/프로그래머스(Python)

[알고리즘] 프로그래머스 프렌즈4블록 / python

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

 

프로그래머스

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

programmers.co.kr

 

✔ 풀이

한 turn에서 없앨 수 있는 블록을 한번에 모아모아서 없애기 -> 밑으로 내리기

겹쳐져 있는 블록을 위해서 0으로 만드는 작업을 lst배열에 모아 한번에 한다.

블록을 모으는 lst배열이 비어있다면 작업들을 끝내고 0의 갯수(=없어진 블록의 갯수)를 센다.

check 함수 👉 board의 모든 좌표에서 ➡ ↘ ⬇ 좌표를 확인하고 set에 넣어서 4개 모두 같은 값인지 확인

del_down 함수 👉 없애야 하는 블록을 0으로 만들고, 열을 기준으로 비교하면서 밑으로 내린다.

def check(m, n, B):
    lst = []
    dx, dy = [0, 0, 1, 1], [0, 1, 1, 0]
    for i in range(m-1):
        for j in range(n-1):
            if B[i][j] != 0:
                ck_set = set()
                for k in range(4):
                    ck_set.add(B[i + dx[k]][j + dy[k]])
                if len(ck_set) == 1:
                    for k in range(4):
                        lst.append([i + dx[k], j + dy[k]])
    return lst

def del_down(m, n, B, lst):
    for i in lst:
            B[i[0]][i[1]] = 0
        
    for _ in range(m):
        for j in range(n):
            for i in range(m-1):
                if B[i][j] != 0 and B[i+1][j] == 0:
                    B[i][j], B[i+1][j] = 0, B[i][j]
    return B

def solution(m, n, board):
    B = [list(i) for i in board]
    
    while True:
        lst = check(m, n, B)
        if not lst:
            break
        B = del_down(m, n, B, lst)
        
    answer = 0
    for ans in B:
        answer += ans.count(0)
    
    return answer