현제의 현재이야기
[codetree] 떨어지는 1자 블록 본문
| 문제
0과 1로만 채워져 있는 n * n 크기의 격자판 정보가 주어집니다. 0은 빈 칸을, 1은 해당 칸에 블럭이 채워져 있음을 뜻합니다.
이때 1 * m 크기의 블럭이 격자판 위에서 떨어집니다. 이 블럭은 k번째 열 부터 k + m - 1번째 열까지의 공간을 차지하며, 가장 위에서부터 밑으로 떨어집니다. 만약 이 블럭이 떨어지는 도중 단 한곳에라도 이미 격자판 위에 놓여있던 블럭과 맞닿게 된다거나, 혹은 바닥에 닿게 된다면 떨어지는 것을 멈추게 됩니다.
내 풀이
arr = list(map(int, input().split()))
n = arr[0]
m = arr[1]
k = arr[2]
grid = [
list(map(int, input().split()))
for _ in range(n)
]
save = [item[:] for item in grid]
rst = True
dx, dy = (1, 0)
row = 0
def in_range(x, y):
return 0 <= x < n and 0 <= y < n
while rst:
for i in range(m):
x, y = (row, k-1+i)
grid[x][y] = 1
for i in range(m):
x, y = (row, k-1+i)
kx, ky = x + dx, y + dy
if in_range(kx, ky) == False:
rst = False
break
save[x][y] = 0
save[kx][ky] = 1
if rst == False:
break
for i in range(m):
x, y = (row, k-1+i)
nx, ny = x + dx, y + dy
if grid[nx][ny] == 1:
rst = False
break
if rst:
row += 1
grid = [item[:] for item in save]
for elems in grid:
for elem in elems:
print(elem, end=' ')
print()
예시 풀이: https://www.codetree.ai/missions/2/problems/falling-horizontal-block/explanation
# 변수 선언 및 입력:
n, m, k = tuple(map(int, input().split()))
grid = [
list(map(int, input().split()))
for _ in range(n)
]
# 해당 row에 [col_s, col_e] 열에
# 전부 블럭이 없는지를 확인합니다.
def all_blank(row, col_s, col_e):
return all([
not grid[row][col]
for col in range(col_s, col_e + 1)
])
# 최종적으로 도달하게 될 위치는
# 그 다음 위치에 최초로 블럭이 존재하는 순간임을 이용합니다.
def get_target_row():
for row in range(n - 1):
if not all_blank(row + 1, k, k + m - 1):
return row
return n - 1
k -= 1
# 최종적으로 멈추게 될 위치를 구합니다.
target_row = get_target_row()
# 최종 위치에 전부 블럭을 표시합니다.
for col in range(k, k + m):
grid[target_row][col] = 1
for i in range(n):
for j in range(n):
print(grid[i][j], end=" ")
print()
| 알게된 점
- 2차원 배열 복사는 arrB = [item[:] for item in arrA]
- 이게 deepcopy보다 훨씬 빠르다.
- https://velog.io/@emplam27/파이썬-리스트의-깊은복사는-deepcopy가-빠를까-slicing이-빠를까
'algorithm' 카테고리의 다른 글
[codetree] 나이트, 안전지대(BFS, DFS) (0) | 2023.02.09 |
---|---|
[codetree] 행복한 수열 (0) | 2023.02.05 |
[SWExpertAcademy] 1206. [S/W 문제해결 기본] 1일차 - View (0) | 2022.11.21 |
[SWExpertAcademy] 14692. 통나무 자르기 (0) | 2022.11.19 |
[백준/python] 2302 - 극장 좌석 (0) | 2022.11.08 |
Comments