[programmers] 프렌즈4블록
resilient
·2022. 2. 7. 13:06
728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/17679
- 이 문제는 조건에 따라 순서대로 구현하면 되는 문제입니다.
- 먼저 2 x 2 총 4개의 블록이 같은 블록인지 확인해주고, 같은 블록이라면 삭제해주고, 삭제해준 빈 공간에 다른 블록들이 떨어지게 하는 함수 이렇게 총 3개의 함수로 나눠서 구현해줬습니다.
- 주의할 점은 4개의 블록이 같은 블록인지 확인해주는 함수에서, 완전 탐색을 이용해서 현재 좌표의 블록, 그리고 아래, 오른쪽, 오른쪽 아래 대각선 블록을 확인해주는 방식으로 구현했는데, 중복되는 블록들이 있을 수 있습니다. 따라서 set함수를 이용해서 블록들이 중복되지 않게 구현했습니다.
- 3개의 함수를 모두 구현한 뒤, while문으로 4개짜리 블록이(없앨 수 있는 블록이) 하나도 없고, 빈 자리를 채우기 위해 아래로 떨어질 블록들도 없다면, break 해서 갱신했던 answer를 return 했습니다.
- 자세한 설명은 주석을 참고해주시면 감사하겠습니다.
def solution(m, n, board):
answer = 0
# 4개 모이는지 확인하는 함수
def check(board):
block = 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]:
block.update({(i,j),(i+1,j),(i+1,j+1),(i,j+1)})
return block
# 없앤 블록들 0으로 처리하는 함수
def remove(block,board):
board = [list(r) for r in board]
for blo in block:
x,y = blo
board[x][y] = ''
return board
# 내려보내는 함수
def down(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:
# 여기서 4개짜리 묶음이 하나도 없는지 체크해서 41번째줄에 전달
block = check(board)
answer += len(block)
# 삭제
board = remove(block,board)
#while문을 돌리기위한 cnt = 1
print(board)
cnt = 1
while cnt:
# 내려보낸 결과 board 와 하나라도 내려갔는지 cnt를 return 받는다.
cnt,board = down(board)
if not cnt and not len(block):
break
return answer
반응형
'자료구조 & 알고리즘 > 프로그래머스(programmers)' 카테고리의 다른 글
[programmers] 후보키(2019 KAKAO BLIND RECRUITMENT) (0) | 2022.02.15 |
---|---|
[programmers] 괄호변환 (0) | 2022.02.09 |
[programmers] 징검다리 (0) | 2022.02.01 |
[programmers] 단어 변환 (0) | 2022.01.30 |
[programmers] 순위 검색 (2021 카카오 블라인드 채용) (0) | 2021.12.17 |