본문 바로가기
Algorithm(CodeTree, Python)/BFS

[코드트리] 상한 귤 Python

by kurooru 2023. 3. 2.
# n, k 입력
n, k = map(int, input().split())
# box 입력
box = [
    list(map(int, input().split()))
    for _ in range(n)
]

# in_range
def in_range(x, y):
    return 0 <= x < n and 0 <= y < n

# can_spread
def can_spread(x, y):
    # 범위 내에 있고, 방문한 적 없으며, 귤이면 됨
    return in_range(x, y) and not visited[x][y] and box[x][y] == 1

# bfs
def bfs():
    while q:
        x, y = q.popleft()
        dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
        for dx, dy in zip(dxs, dys):
            nx, ny = x + dx, y + dy
            if can_spread(nx, ny):
                q.append((nx, ny))
                visited[nx][ny] = True
                step[nx][ny] = step[x][y] + 1

# 설계
# visited
visited = [
    [False] * n
    for _ in range(n)
]

# step
step = [
    [0] * n
    for _ in range(n)
]

# 큐 사용 준비
from collections import deque
q = deque()

# gone_oranges
gone_oranges = []

# box를 돌면서
for i in range(n):
    for j in range(n):
        # 상한 귤을 발견하면
        if box[i][j] == 2:
            # gone_oranges에 추가
            gone_oranges.append((i, j))

# 상한 귤을 모두
for orange in gone_oranges:
    # unpacking
    orange_x, orange_y = orange
    
    # 큐에 넣어주고
    q.append((orange_x, orange_y))
    # 방문 처리 해 주고
    visited[orange_x][orange_y] = True

# bfs()
bfs()

for i in range(n):
    for j in range(n):
        # 0이면
        if not box[i][j]:
            # -1로 기록
            step[i][j] = -1
        # 귤이였으나 안상했으면
        if box[i][j] == 1 and not visited[i][j]:
            # -2로 기록
            step[i][j] = -2

# 출력
for i in range(n):
    for j in range(n):
        print(step[i][j], end=' ')
    print()