보물창고 블로그

2018 KAKAO BLINDRECRUITMENT 1차 프렌즈4블록 본문

알고리즘 풀이/프로그래머스

2018 KAKAO BLINDRECRUITMENT 1차 프렌즈4블록

홋 메 2020. 3. 26. 16:04
728x90

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

 

프로그래머스

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

programmers.co.kr

먼저 board는 문자열로 주어지므로 처리하기 용이함을 위해 map1이라는 2차원 리스트를 만들어 각 문자를 한 글자씩 2차원 리스트 원소로 넣어준 뒤에 각 지점을 기준으로 아래, 오른쪽, 오른쪽 아래가 같을 경우에 change라는 딕셔너리에 위치를 넣고, 각 지점이 지워질 때 0으로 대체하고 블록 개수를 answer값에 더해준다. 이후 위에 있는 블록들이 떨어지는 것을 처리하는 함수 clean을 이용하여 블록들을 아래로 떨어뜨리고 다시 탐색을 반복하여 지워질 블록이 없어질 때까지 계속 반복한다. 마지막에 answer값을 반환한다.

def clean(m, n, map1):
    for i in range(n):
        for j in range(m - 2, -1, -1):
            if map1[j][i] != 0:
                count = 0
                while 1:
                    if j + count + 1 < m and map1[j + count + 1][i] == 0:
                        count += 1
                    else:
                        break
                if count > 0:
                    map1[j + count][i] = map1[j][i]
                    map1[j][i] = 0


def solution(m, n, board):
    dx = [0, 1, 1, 0]
    dy = [0, 0, 1, 1]
    answer = 0
    map1 = [[0] * n for _ in range(m)]
    for i in range(m):
        for j in range(n):
            map1[i][j] = board[i][j]
    while 1:
        change = {}
        for i in range(m):
            for j in range(n):
                if i + 1 < m and j + 1 < n:
                    if map1[i][j] == map1[i][j + 1] == map1[i + 1][j] == map1[i + 1][j + 1] != 0:
                        for d in range(4):
                            if change.get((i + dx[d], j + dy[d])) is None:
                                change[(i + dx[d], j + dy[d])] = True

        if change:
            answer += len(change)
            for p in change:
                map1[p[0]][p[1]] = 0
            clean(m, n, map1)
        else:
            break
    return answer

 

Comments