- 문제 : https://www.acmicpc.net/problem/7576
문제 이해
- 2차 행렬이 주어지는데 1은 토마토가 있는 곳, -1은 박스가 있어서 이동을 못하고, 0은 토마토가 있는 부분이다.
- 토마토가 있는 1을 중심으로 상하좌우에 0인 지점들로 bfs를 진행하는 문제다.
- 풀면서 헷갈렸던 부분이 처음에 1인 지점(토마토가 있는 지점)이 여러개 있을텐데 이게 어떻게 동시다발적으로 진행시키지?였다.
좀 헤매다가 답을 보니 처음에 행렬이 주어질 때 1인 지점들을 미리 queue에 담아두었다가 그거를 중심으로 bfs를 진행하면 된다.
풀이 로직
- 입력값 n, m, matrix를 저장하고 matrix를 입력받을 때 1인 지점은 따로 queue에 저장한다.
- bfs를 실행하는데 방문여부는 visit로, 토마토 개수는 matrix를 이용해서 기록한다.
- bfs를 끝낸 뒤 행렬을 전체 탐색하면서 0인 지점(안 익은 토마토)이 있으면 실패이고, 없다면 전체 값 중에 최대값을 출력하면 된다.
실패 여부는 flag를 이용해서 matrix에서 0인 지점이 있다면 False 처리한다.
- flag 값에 따라 값을 다르게 출력해준다.
정답 풀이
이전에 풀 때는 엄청 쉬웠던 것 같은데 다시 풀려니까 쉽지않다^^;
from collections import deque
def bfs():
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
while queue :
x, y = queue.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if not visit[nx][ny] and matrix[nx][ny] == 0:
visit[nx][ny] = 1
matrix[nx][ny] = matrix[x][y] + 1
queue.append([nx, ny])
m, n = map(int, input().split())
matrix = []
queue = deque()
for i in range(n):
matrix.append(list(map(int, input().split())))
for j in range(m):
if matrix[i][j] == 1:
queue.append([i, j])
visit = [[0] * m for _ in range(n)]
bfs()
answer = 0
flag = True
for i in range(n):
if 0 in matrix[i]:
flag = False
break
else:
answer = max(answer, max(matrix[i]))
if flag == True:
print(answer - 1)
else:
print(-1)
'백준 > Search' 카테고리의 다른 글
[bfs/백준] 2206번 : 벽 부수고 이동하기 (0) | 2023.05.20 |
---|---|
[bfs/백준] 16234번 : 인구 이동 (0) | 2023.05.17 |
[bfs/백준] 6593번 : 상범 빌딩 (0) | 2023.05.16 |
[bfs/백준] 5014번 : 스타트링크 (0) | 2023.05.16 |
[bfs/백준] 1743번 : 음식물 피하기 (1) | 2023.05.16 |