[Programmers/프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차] 프렌즈4블록 - Python/파이썬 [해설/풀이]

SihoonCho·2022년 9월 22일
0
post-thumbnail
[Programmers/프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차 코딩테스트]
  1. [Lv. 1] 비밀 지도
  2. [Lv. 1] 다트 게임
  3. [Lv. 2] 캐시
  4. [Lv. 3] 셔틀버스
  5. [Lv. 2] 뉴스 클러스터링
  6. [Lv. 2] 프렌즈4블록
  7. [Lv. 3] 추석 트래픽

📌 문제






📝 입력 형식


💻 출력 형식


📖 입출력 예제


📖 예제에 대한 설명


📌 풀이


def erase(m, n, board):
    erase_list = []
    for row in range(n - 1):        # 전치행렬, m 폭 -> 높이
        for col in range(m - 1):    # 전치행렬, n 높이 -> 폭
            if board[row][col] == board[row][col+1] == board[row+1][col] == board[row+1][col+1] != 'X':
                # 현재위치(좌상단)을 기준으로 주변 4개 블록이 같고, 이미 지워진 블록이 아니면
                erase_list.append((row, col))           # 좌상단
                erase_list.append((row, col + 1))       # 우상단
                erase_list.append((row + 1, col))       # 좌하단
                erase_list.append((row + 1, col + 1))   # 우하단

    erase_set = set(erase_list)     # 겹치는 블록 중복 카운팅 방지
    for row, col in erase_set:      # 지워야 하는 블록에 대해
        board[row][col] = 0         # 일단 0으로 처리

    for idx, row in enumerate(board):                               # 보드의 각 행에 대해
        empty = ['X'] * row.count(0)                                # 왼쪽, 지운 개수만큼의 'X' 블록
        board[idx] = empty + [elem for elem in row if elem != 0]    # 오른쪽, 안 지운 블록의 묶음

    return len(erase_set)

def solution(m, n, board):
    # 인덱스 슬라이싱을 통해 떨어지는 블록을 구현
    board = [list(x) for x in zip(*board)]  # 전치행렬

    answer = 0
    while True:
        erase_cnt = erase(m, n, board)  # 지워진 블록의 개수
        answer += erase_cnt             # 합산
        if erase_cnt == 0:              # 더 이상 지울 수 있는 블록이 없다면
            break                       # 정지

    return answer
profile
꾸준히 노력하는 개발자

0개의 댓글