본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[프로그래머스] Lv.2 프렌즈4블록 - Python

by chaemj97 2022. 6. 30.
728x90

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

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr


  • 생각
    •  위에서 떨어지는게 아니라 오른쪽에서 왼쪽으로 떨어지도록 돌리기
      • 같은 열에서 위에서부터 지우는 것보다 같은 행에서 지우는게 더 편할 것 같아서
    • 이번 turn에 터트릴 수 있는 위치 set에 담기
      • 중복을 제거하기 위해
    • 터트릴 수 있는 위치 0으로 바꾸고 왼쪽으로 떨어지도록 하기
      • A C 0 0 C -> A C C 0 0 으로 바꾸기
    • 터트릴 수 있는게 0개 일 때까지 반복
  • 코드
def solution(m, n, board):
    # 위에서 떨어지는게 아니라 오른쪽에서 왼쪽으로 떨어지도록 돌리기
    board = list(map(list,zip(*board[::-1])))
    poppop_count = 0
    
    # 터트릴게 없을 때까지
    while True:
        # 이번 turn에 터트린 위치 set
        poppop = set()
        for r in range(n-1):
            for c in range(m-1):
                # 2x2 형태로 4개가 같다면 (터트린 위치의 값은 0)
                if board[r][c] == board[r+1][c] == board[r+1][c+1] == board[r][c+1] != 0:
                    # 집합 더하는 방법 set |= set
                    poppop |= set([(r,c),(r+1,c),(r+1,c+1),(r,c+1)])
        
        # 터트리고 칸 채우기
        for i,j in poppop:
            board[i][j] = 0
        for r in range(n):
            zero = []
            nonzero = []
            for c in range(m):
                if board[r][c] == 0:
                    zero += [0]
                else:
                    nonzero += board[r][c]
            board[r] = nonzero + zero

        # 이번 turn에 터트린게 없으면 끝내기
        if len(poppop) == 0:
            break
            
        # 터트린 블록 수 더하기
        poppop_count += len(poppop)
        
    return poppop_count
728x90
반응형

댓글