Coding - Algo/python
[프로그래머스] 프렌즈4블록 (python 파이썬)
jainn
2021. 6. 6. 23:35
728x90
문제
https://programmers.co.kr/learn/courses/30/lessons/17679
풀이 및 소스코드
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
반응형