나의 개발일지

[프로그래머스] Lv.2 [1차] 프렌즈4블록 [Python, 파이썬] KAKAO 본문

프로그래머스

[프로그래머스] Lv.2 [1차] 프렌즈4블록 [Python, 파이썬] KAKAO

YoonJuHan 2023. 10. 5. 15:56
  • 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/17679
  • 🔑 좌표 얻고, 터뜨리고, 내리기를 터뜨릴 게 없을 때까지 반복하면 되는 문제
    • 4개가 모였다고 바로 터뜨리면 안 되고 모여있는 애들을 한 번에 터뜨려야 한다.
    • 내리기는 제일 마지막 행부터 올라오면서 빈 공간이면 같은 열 위쪽에 처음 만나는 애와 자리 바꾼다.
    • 터뜨릴 수 있는 좌표가 없으면 끝
    • answer은 마지막에 board를 다시 돌면서 빈 공간의 개수를 세도 되지만 바로바로 더해줬다.

 

def solution(m, n, board):
    answer = 0
    
    for i in range(m):  # 2차원 리스트로 변환
        board[i] = list(board[i])

    def getCoord(): # 4개 모여있는 좌표 얻기
        for i in range(m-1): 
            for j in range(n-1):
                if board[i][j] != "" and board[i][j] == board[i][j+1] == board[i+1][j] == board[i+1][j+1]:
                    coord.append((i, j))
                    coord.append((i, j+1))
                    coord.append((i+1, j))
                    coord.append((i+1, j+1))

        return coord
                    
    def explosion(coord): # 터뜨리기
        for i in coord:
            x, y = i
            board[x][y] = ""
            
    def down(): # 내리기
        for i in range(m-1, 0, -1): # 제일 마지막 행 부터 올라가면서 확인
            for j in range(n):
                if board[i][j] == "": # 빈 공간이면
                    for k in range(i-1, -1, -1):    # 같은 열 위쪽을 확인
                        if board[k][j] != "":   # 문자가 있으면 내림
                            board[i][j] = board[k][j]
                            board[k][j] = ""
                            break
                        
    while True:
        coord = []  # 4개 모인 좌표 저장
        
        if not getCoord():  # 터뜨릴 수 있는 좌표가 없으면 끝
            break
            
        answer += len(set(coord))   # 중복되는 좌표 없애고 길이 더함
        
        explosion(set(coord))
        
        down()
    
    return answer
Comments