728x90
프렌즈 4블록 문제 설명은 다음 링크를 참고해주시기 바랍니다. 문제 설명
프렌즈 4블록은 2 x 2 형태의 패턴을 말하는 것으로 블록이 주어지면 해당 패턴을 찾아 사라지게 합니다. 이때, 블록 1개 당 1점으로 점수를 계산하여 총 얻은 점수를 결과로 반환하는 문제입니다.
블록을 사라지게 한 후에는 블록들은 아래로 떨어지게 되어 빈 공간을 채워줘야 합니다. 다음은 문제 해결 순서입니다.
- board를 순환하며 2 x 2 패턴을 찾아 삭제해야할 블록들의 좌표를 저장한다.
- 좌표가 중복될 수 있기 때문에 좌표 저장은 집합을 사용하여 저장한다.
- answer에 1의 결과의 개수만큼 더해준다.
- 1의 결과를 순환하며 board의 값을 '0'으로 바꿔 사라지게 해준다.
- 블록을 아래로 떨어뜨려 빈 공간을 채워준다.
- 1을 반복한다.
다음은 문제 해결 순서를 기반으로 작성한 코드입니다.
def destroy_block_list(m,n,board):
destroy = set()
for x in range(m-1):
for y in range(n-1):
if board[x][y] == board[x+1][y] == board[x][y+1] == board[x+1][y+1] and board[x][y] != '0':
destroy.add((x,y))
destroy.add((x+1,y))
destroy.add((x,y+1))
destroy.add((x+1,y+1))
return destroy
def falling_board(m,n,board):
is_invalid = True
while is_invalid:
is_invalid = False
for x in range(m-1):
for y in range(n):
if board[x+1][y] == '0' and board[x][y] != '0':
is_invalid = True
board[x][y], board[x+1][y] = '0', board[x][y]
return board
def solution(m, n, board):
answer = 0
board = [list(item) for item in board]
destroy_list = destroy_block_list(m,n,board)
while destroy_list:
answer += len(destroy_list)
for x, y in destroy_list:
board[x][y] = '0'
board = falling_board(m, n, board)
destroy_list = destroy_block_list(m,n,board)
return answer
코드를 제출했을 때 테스트 케이스 5, 10번이 실패를 하였습니다. 이유를 확인하기 위해 print(board)를 사용하여 board의 값들을 확인해보았더니 블록들이 빈공간을 제대로 채워주지 않았다는 것을 확인할 수 있었습니다.
따라서 while문, is_invalid 변수를 추가하여 board에서 모든 빈 공간이 제대로 채워지도록 반영하는 것으로 문제를 해결하였습니다.
728x90
'취업을 준비하며 정리하는 컴퓨터 지식 > Problem Solving' 카테고리의 다른 글
[Problem Solving] 백준 4179 불! (0) | 2022.01.31 |
---|---|
[Problem Solving] 프로그래머스 77884 약수의 개수와 덧셈 (0) | 2022.01.24 |
[Problem Solving] 프로그래머스 92335 k 진수에서 소수 개수 구하기 (2) | 2022.01.19 |
[Problem Solving] 프로그래머스 92341 주차 요금 계산 (0) | 2022.01.17 |
[Problem Solving] 프로그래머스 92334 신고 결과 받기 (0) | 2022.01.14 |