본문 바로가기

알고리즘/카카오 EASY

프렌즈4블록 (Level 2)

문제

 

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

 

프로그래머스

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

programmers.co.kr

 

내 풀이

 

board의 내부의 자료형이 문자열이므로 리스트로 바꾸었다.

 

board 전체를 돌면서 2x2의 블록이 동일한 경우를 찾고, 제거해야 할 블록을 담는 리스트인 rm에 담았다.

rm 안에는 중복이 있을 수 있으므로 set으로 변환하여 길이를 구하고 answer에 추가하였다. 만약, set으로 변환된 rm의 길이가 0이면 더 이상 제거할 블록이 없다는 뜻이므로 하던 동작을 중단하면 된다.

 

rm을 다 만들었으면, rm을 참고하여 제거해야 할 블록들을 전부 '#'으로 만들었다. '#'은 빈 공간을 뜻하게 된다.

 

마지막으로 빈 공간보다 위에 있는 블록들을 아래로 내려준다. tmp를 이용하여 간단하게 조작하였다.

 

def solution(m, n, board):
    answer = 0
    
    board = [list(x) for x in board]

    while True:
        
        rm = []
        for i in range(len(board)):
            for j in range(len(board[0])):
                if i+1 < len(board) and j+1 < len(board[0]) and board[i][j] != '#' and board[i][j] == board[i+1][j] and board[i][j] == board[i][j+1] and board[i][j] == board[i+1][j+1]:
                    rm.extend([(i, j), (i+1, j), (i, j+1), (i+1, j+1)])

        if not len(set(rm)): break
        
        answer += len(set(rm))

        for r in rm:
            board[r[0]][r[1]] = '#'

        for j in range(len(board[0])):
            tmp = []
            for i in range(len(board)):
                if board[i][j] != '#': tmp.append(board[i][j])
            if len(tmp) < len(board[0]):
                tmp = ['#']*(len(board) - len(tmp)) + tmp
            for i in range(len(board)):
                board[i][j] = tmp[i]
        
    return answer

 

총평

 

다른 풀이 중에 map을 사용해서 board의 자료형을 바꾼 것이 있었다. map의 사용법도 좀 익혀 놓아야겠다고 생각했다.

'알고리즘 > 카카오 EASY' 카테고리의 다른 글

비밀지도 (Level 1)  (0) 2022.07.11
캐시 (Level 2)  (0) 2022.07.08
후보키 (Level 2)  (0) 2022.07.07
순위 검색 (Level 2)  (0) 2022.07.05
튜플 (Level 2)  (0) 2022.07.04