728x90
https://programmers.co.kr/learn/courses/30/lessons/17679
접근
문제에서 주어진 조건대로 구현하면 되는 문제이다. 따라서 아래와 같은 로직으로 구현하였다.
- 2x2크기로 같은 것이 붙어있는지 확인한다.
- 위의 조건에 부합하는게 있다면 해당 인덱스에 1로 표시한다.
- 1로 표시한 것의 개수를 구하고 1로 표시된 것은 비어있다는 의미로 0으로 표시한다.
- 위의 블록이 아래로 이동하도록 한다.
구현
- 위에서 적은 로직을 아래와 같이 코드로 구현하였다.
- check라는 2차원 리스트를 생성하였고 여기에 2x2 블록이 존재했을 때 1로 표시한다.
- 0으로 초기화된 2차원 리스트인 new_board를 생성하고
- check를 탐색하여 1일 때는 answer만 증가시키고 건너띄고 아닐 때는 board의 값을 new_board에 저장한다.
- 이제 new_board에서 위의 블록들을 아래로 이동시킨다.
isUpdate = True
while isUpdate:
isUpdate = False
check = [[0 for _ in range(n)] for _ in range(m)]
for y in range(1, m):
for x in range(1, n):
if isPossible(y, x, board):
isUpdate = True
check = update_check(y, x, check)
new_board = [[0 for _ in range(n)] for _ in range(m)]
for y in range(m):
for x in range(n):
if check[y][x]:
answer += 1
continue
new_board[y][x] = board[y][x]
board = move_board(m, n, new_board)
전체 코드
def isPossible(y, x, board):
s = board[y][x]
dy = [0, -1, -1]
dx = [-1, 0, -1]
for d in range(3):
ny = y + dy[d]
nx = x + dx[d]
if s != board[ny][nx] or board[ny][nx] == 0:
return False
return True
def check_range(y, x, m, n):
return (0 <= y < m) and (0 <= x < n)
def update_check(y, x, check):
dy = [0, -1, -1]
dx = [-1, 0, -1]
check[y][x] = 1
for d in range(3):
ny = y + dy[d]
nx = x + dx[d]
check[ny][nx] = 1
return check
def move_board(m, n, board):
for x in range(n):
for y in range(m-1, -1, -1):
ny = y
while True:
ny += 1
if (not check_range(ny, x, m, n)) or board[ny][x] != 0:
ny -= 1
break
board[ny][x], board[y][x] = board[y][x], board[ny][x]
return board
def solution(m, n, board):
answer = 0
isUpdate = True
while isUpdate:
isUpdate = False
check = [[0 for _ in range(n)] for _ in range(m)]
for y in range(1, m):
for x in range(1, n):
if isPossible(y, x, board):
isUpdate = True
check = update_check(y, x, check)
new_board = [[0 for _ in range(n)] for _ in range(m)]
for y in range(m):
for x in range(n):
if check[y][x]:
answer += 1
continue
new_board[y][x] = board[y][x]
board = move_board(m, n, new_board)
return answer
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[Level 2] 메뉴 리뉴얼 (0) | 2021.09.02 |
---|---|
[Level 2] 오픈채팅방 (0) | 2021.08.30 |
[Level 2] 뉴스 클러스터링 (0) | 2021.08.29 |
[Level 1] 실패율 (0) | 2021.08.03 |
[Level 1] 키패드 누르기 (0) | 2021.07.31 |