프로그래머스 : 2018 KAKAO BLIND RECRUITMENT [1차] 프렌즈4블록
2021. 10. 29. 15:30ㆍ문제풀기/프로그래머스
https://programmers.co.kr/learn/courses/30/lessons/17679
최근에 본 코딩테스트에서 거의 동일한 문제를 푼 적이 있다. 근데 어딘지 기억이 안남.....
이런 문제의 경우 여러 함수로 기능을 나눠서 구현하는 것이 디버깅하기도 편하고, 코드 고치기도 편하다.
아직 함수 이름을 어떻게 지어야 좋은지를 잘 모르겠지만...
- check_erase : 지울게 있는지 확인 후, 지울 게 있다면 2*2 부분의 가장 위, 가장 왼쪽에 있는 블록의 위치를 넣은 result를 리턴한다.
- erase_board : board 배열에서 erase_arr에 있는 2*2 부분의 시작점을 기준으로 4개 블록을 지운다. 이 때, 이미 지운 부분이 있을 수 있기 때문에 0인지 확인하고 count를 더해준다. 그리고 count를 리턴
- rearrange_board : board 배열에서 중간중간 0으로 비어 있는 부분을 당겨준다.
def check_erase(m,n,board):
result = []
move = [(1,0),(0,1),(1,1)]
for y in range(m):
for x in range(n):
if board[y][x] == 0:
continue
check = True
for my,mx in move:
dy = y+my
dx = x+mx
if dy>=m or dx>=n:
check = False
break
if board[y][x] != board[dy][dx]:
check = False
break
if check == True:
result.append((y,x))
return result
def erase_board(m,n,board,erase_arr):
move = [(0,0),(1,0),(0,1),(1,1)]
count = 0
for y,x in erase_arr:
for my,mx in move:
dy = y+my
dx = x+mx
if board[dy][dx] != 0:
count += 1
board[dy][dx] = 0
return count
def rearrange_board(m,n,board):
new_board = [[] for _ in range(n)]
for x in range(n):
for y in range(m-1,-1,-1):
if board[y][x] != 0:
new_board[x].append(board[y][x])
board = [[0 for _ in range(n)] for _ in range(m)]
for y in range(n):
for x in range(len(new_board[y])):
board[m-x-1][y] = new_board[y][x]
return board
def solution(m, n, board):
answer = 0
board = list(map(list,board))
while True:
erase_arr = check_erase(m,n,board)
if len(erase_arr) == 0:
break
answer += erase_board(m,n,board,erase_arr)
board = rearrange_board(m,n,board)
return answer
'문제풀기 > 프로그래머스' 카테고리의 다른 글
프로그래머스 : 올바른 괄호 (0) | 2021.10.30 |
---|---|
프로그래머스 : 구명보트 (0) | 2021.10.29 |
프로그래머스 : 여행 경로 (0) | 2021.10.29 |
프로그래머스 : 등굣길 (0) | 2021.10.28 |
프로그래머스 : 위클리 챌린지 - 12주차 (0) | 2021.10.28 |