티스토리 뷰

728x90

문제

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

 

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

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

programmers.co.kr

 

풀이 및 소스코드

def solution(m, n, board):
    answer = 0
    for i in range(len(board)):
        popped = board.pop(0)
        board.append([p for p in popped])
    while 1:
        check = []
        for i in range(m-1):
            for j in range(n-1):
                if board[i][j] == '0':
                    continue
                if board[i][j] == board[i][j+1]: #윗줄이 같고
                    if board[i][j] == board[i+1][j+1] and board[i][j] == board[i+1][j]: #윗줄과 아랫줄 모두 같을 때
                        check.append((i, j)) #check에 넣음
                        check.append((i, j+1))
                        check.append((i+1, j))
                        check.append((i+1, j+1))
        if len(check) == 0: #같은 게 없다면 반복문 종료
            break
        else:
            answer += len(set(check)) #같은 게 있다면 set 함수를 사용하여 중복제거 후 카운트해줌
            for c in check: #check에 들어가있는 것들 터트리기
                board[c[0]][c[1]] = '0'
            for c in reversed(check): #밑에서부터 안터진 블록 내리기
                check_n = c[0]-1 #check_n = 안터졌는지 확인 하는 위치를 담는 변수
                put_n = c[0] 
                while check_n >= 0:
                    if board[put_n][c[1]]=='0' and board[check_n][c[1]]!='0': #만약 위에는 블록이 있고, 밑에 블록이 없다면
                        board[put_n][c[1]] = board[check_n][c[1]] #내려주기
                        board[check_n][c[1]] = '0'
                        put_n -= 1
                    check_n -= 1
    return answer
반응형