현제의 현재이야기

[codetree] 떨어지는 1자 블록 본문

algorithm

[codetree] 떨어지는 1자 블록

현재의 현제 2023. 2. 4. 12:28

| 문제

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()

| 알게된 점

 

[파이썬] 리스트의 깊은복사는 deepcopy가 빠를까? slicing이 빠를까?

리스트의 깊은복사는 어떤게 더 빠를까?

velog.io

 

Comments