💬 문제 설명
블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록".
같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.
입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.
💬 코드
def solution(m, n, board):
answer = 0
# 지울거 찾기
def find(board):
target = set()
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]:
target.update({(i, j), (i+1, j), (i, j+1), (i+1, j+1)})
return target
# 지우기
def remove(target, board):
board = [list(row) for row in board]
for loc in target:
i, j = loc
board[i][j] = ''
return board
# 이동하기
def move(board):
cnt = 0
for i in range(m-1):
for j in range(n):
if board[i][j] and not board[i+1][j]:
board[i][j], board[i+1][j] = board[i+1][j], board[i][j]
cnt += 1
return cnt, board
while 1:
target = find(board)
answer += len(target)
board = remove(target, board)
cnt = 1
while cnt:
cnt, board = move(board)
if not cnt and not len(target):
break
return answer
1. 지워야 하는 블록을 찾아서 set에 추가해준다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워지기 때문에 set 자료형을 사용한다.
2. 지워야 하는 블록을 ''으로 변경해준다. 원래는 보기 좋으라고 ' '←이렇게 공백을 넣어주려고 했으나, 나중에 이동할 때 코드가 예쁘지않을 것 같아서 ''를 사용했다(' '를 하면 board[i+1][j]==' '라고 해야하는데 ''로 해서 not board[i+1][j]라고 할 수 있음).
3. 아래에 공백이 생긴 경우 블록을 내려준다.
1-3의 과정을 더 이상 옮길게 없고 지워지는 블록도 없을 때까지 반복한다.
'Algorithm > Python' 카테고리의 다른 글
[파이썬/백준 1260]DFS와 BFS (0) | 2021.04.15 |
---|---|
[파이썬/프로그래머스]압축 (0) | 2021.04.14 |
[파이썬/프로그래머스][3차]오픈채팅방 (0) | 2021.04.10 |
[파이썬/프로그래머스][3차]파일명 정렬 (0) | 2021.04.09 |
[파이썬/프로그래머스][3차] n진수 게임 (0) | 2021.04.09 |