Save my data

백준 7576 : 토마토 (파이썬) 본문

알고리즘/백준

백준 7576 : 토마토 (파이썬)

양을 좋아하는 문씨 2023. 3. 4. 17:21

BFS로 풀 수 있는 문제이다.

BFS의 queue에 집어넣고 빼면서 탐색하는 방식을 잘 이해하고 있다면 어렵지 않게 풀었을 것이다.

이 문제와 다른 기초 문제들간의 차별점은 예제 3번과 같이 시작점이 두 개가 되는 경우도 고려해야 한다는 점이다.

이 경우 시작이 되는 Queue 에 두 점의 좌표를 같이 넣어주면 양 방향에서 동시에 탐색을 시작한다.

 

그 외의 조건들은 단순히 반복문을 돌려서 검출해내도 되기 때문에 그다지 어려운 점은 아닌 것 같다.


import sys
from collections import deque
M, N = map(int, sys.stdin.readline().split())
def bfs(box, start):
    mx = 0
    dx = [-1, 0, 1, 0]
    dy = [0, 1, 0, -1]
    queue = deque()
    queue += start
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or nx >= N or ny < 0 or ny >= M:
                continue
            if box[nx][ny] == 0:
                box[nx][ny] += box[x][y] + 1
                if box[nx][ny] > mx:
                    mx = box[nx][ny]
                queue.append((nx, ny))
    for j in box:
        if 0 in j:
            return -1
    return mx - 1
def box_search(n, m):
    box = []
    start = []
    execution = False
    for _ in range(n):
        box.append([*map(int, sys.stdin.readline().split())])
    for i in range(n):
        for j in range(m):
            if box[i][j] == 0:
                execution = True
            if box[i][j] == 1:
                start.append((i, j))
    if not execution:
        return 0
    else:
        return (box, start)
res = box_search(N, M)
print(bfs(*res) if res else res)

 

 

함수를 쓰지 않고 밖으로 몽땅 꺼내서 반복문을 실행해도 되었겠지만 함수를 쓰는 것이 더 좋아서 그냥 썼다.

함수를 쓰는것에 약간 어색했기 때문에 앞으로 되도록이면 문제들을 함수로 풀어 나갈 예정이다.


가끔 백준 코드 길이를 보면 짧게 풀릴 수 있는 문제인데도 엄청 길게 해서 푼 사람들이 있다.

백이면 백 클래스로 푼 사람들이다.

나도 다양한 방식으로 문제들을 풀면서 클래스의 사용법에도 좀 더 익숙해져야 하겠다.

Comments