https://www.acmicpc.net/problem/7576
1. 내가 작성한 코드
from collections import deque
n, m = map(int, input().split())
arr = []
for i in range(m):
arr.append(list(map(int, input().split())))
arr2 = [] #처음 시작이 1인 좌표
cnt = 0
for i in range(m):
for j in range(n):
if arr[i][j] == 1:
arr2.append((i,j))
def bfs():
global cnt
dx = [-1,1,0,0]
dy = [0,0,-1,1]
arr1 = deque()
queue = deque()
for i in arr2:
arr1.append(i)
queue.append(i)
while queue:
while arr1:
x,y = arr1.popleft()
queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx<0 or ny<0 or nx>=m or ny>=n:
continue
if arr[nx][ny] == -1:
continue
if arr[nx][ny] == 0:
arr[nx][ny] = 1
queue.append((nx,ny))
for i in queue:
arr1.append(i)
cnt+=1
return True
bfs()
check = 0
for i in range(m):
if 0 in arr[i]:
check +=1
break
if check == 0:
print(cnt-1)
else: print(-1)
생각을 넘나리 복잡하게 해서 2중 while문을 돌렸다 키키
그냥 평소처럼 while문 한 개를 쓰고, max 값을 뽑아내면 되는 문제~!~!
2. 수정 코드
from collections import deque
n, m = map(int, input().split()) #가로 세로 input
arr = [list(map(int, input().split())) for _ in range(m)] #토마토 첫 상태
queue = deque()
cnt = 0
for i in range(m): #현재 익어있는 토마토를 모두 queue에 append
for j in range(n):
if arr[i][j] == 1:
queue.append((i,j))
def bfs():
dx = [-1,1,0,0]
dy = [0,0,-1,1]
while queue:
x,y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx<0 or ny<0 or nx>=m or ny>=n:
continue
if arr[nx][ny] == -1:
continue
if arr[nx][ny] == 0:
arr[nx][ny] = arr[x][y] + 1
queue.append((nx,ny))
bfs()
check = 0
for i in range(m):#전체를 탐색하면서 0이 있으면 check
if 0 in arr[i]:
check +=1
break
else:
cnt = max(cnt,max(arr[i])) #없으면 cnt에 max value 삽입
if check == 0:
print(cnt-1)
else: print(-1)
3. 메모
열어분 저 처음으로 골드문제 해결했어요👻
'🔅코딩테스트 공부🔅 > ❗백준' 카테고리의 다른 글
[백준] 2630번 색종이 만들기(python) (0) | 2023.02.14 |
---|---|
[백준] 7569번 토마토 (python) (0) | 2023.02.13 |
[백준] 1931번 회의실 배정(python) (0) | 2023.02.11 |
[백준] 2644번 촌수계산(python) (0) | 2023.02.11 |
[백준] 1946번 신입 사원(python) (0) | 2023.02.11 |
댓글