7576번 풀이 코드 관련 질문
안녕하세요 선생님. 7576번 토마토 문제를 풀기 위해 코드를 짜서 제출했는데 자꾸 틀렸다고 처리가 되어서 어디가 문제인지 궁금하여 질문드리려 합니다. time matrix 대신에 visit matrix를 쓰는거 말고는 예시답안과 거의 일치하는것 같은데 어디가 문제일까요?
import sys
from collections import deque
def bfs(cands):
global data, N, M, min_dist, dx, dy
visit = [[False] * M for _ in range(N)]
q = deque()
for (i,j) in cands:
q.append([i,j,0])
visit[i][j] = True
while q:
x,y,dep = q.popleft()
min_dist[x][y] = min(min_dist[x][y], dep)
for di, dj in zip(dx,dy):
ni = x + di
nj = y + dj
if (0<= ni < N) and (0<=nj<M) and (not visit[ni][nj]) and (data[ni][nj] == 0):
q.append([ni,nj,dep+1])
visit[ni][nj] = True
dx = [0,1,0,-1]
dy = [1,0,-1,0]
M, N = map(int, input().split())
data = []
for _ in range(N):
data.append(list(map(int, input().split())))
min_dist = [[1e6]*M for _ in range(N)]
cands = []
for i in range(N):
for j in range(M):
if data[i][j] == 1:
cands.append((i,j))
if data[i][j] == -1:
min_dist[i][j] = -1
bfs(cands)
val = max(max(min_dist))
if val == 1e6:
print(-1)
else:
print(val)
Answer 1
1
안녕하세요, purplejay님!
코드를 살펴본 결과, 올바른 풀이로 코드를 작성하신 거 같습니다.
단, max 함수에 대해 오해를 하시고 사용하신 것 같습니다.
max 함수의 공식 문서를 살펴보면, 원소 중에서 가장 큰 원소를 반환한다고 나와 있습니다.
따라서, 2차원 리스트를 max 함수에 넣는다면 가장 큰 값들로 이루어진 1차원 리스트가 나오는 것이 아닌, 1차원 리스트 중에서 가장 큰 리스트가 반환이 됩니다.
예를 들자면, max([[0, 1, 2], [1, 0, 1]])의 결과는 [2, 1]이 아닌, [1, 0, 1] 이라는 것입니다.
즉, [0, 1, 2]과 [1, 0, 1] 중에서 [1, 0, 1]이 더 크므로 [1, 0, 1]을 반환한 것이죠.
리스트의 크기 비교는 인덱스가 낮은 원소가 더 높으면 크기가 크다고 생각하시면 됩니다.
즉, [1, 1, 1, 2, 1]이 [1, 1, 1, 1, 10]보다 큰 것이죠.
두 리스트의 크기 비교에 관한 자세한 설명은 여기를 참고해세요 :)
질문자님이 의도하신 대로 max 함수를 이용하려면 max(max(md) for md in min_dist) 와 같이 사용하시면 될 것 같습니다. 이를 고쳐 코드를 작성하면 아래와 같이 작성할 수 있겠네요.
import sys
from collections import deque
def bfs(cands):
global data, N, M, min_dist, dx, dy
visit = [[False] * M for _ in range(N)]
q = deque()
for (i, j) in cands:
q.append([i, j, 0])
visit[i][j] = True
while q:
x, y, dep = q.popleft()
min_dist[x][y] = min(min_dist[x][y], dep)
for di, dj in zip(dx,dy):
ni = x + di
nj = y + dj
if (0 <= ni < N) and (0 <= nj < M) and (not visit[ni][nj]) and (data[ni][nj] == 0):
q.append([ni, nj, dep + 1])
visit[ni][nj] = True
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
M, N = map(int, input().split())
data = []
for _ in range(N):
data.append(list(map(int, input().split())))
min_dist = [[1e6] * M for _ in range(N)]
cands = []
for i in range(N):
for j in range(M):
if data[i][j] == 1:
cands.append((i, j))
if data[i][j] == -1:
min_dist[i][j] = -1
bfs(cands)
val = max(max(md) for md in min_dist) # 고친 부분
print(-1 if val == 1e6 else val)
질문에 대해 만족스러운 답변이 되었기를 바랍니다!
추가로 궁금하신 점이나 더 자세한 설명이 필요하시다면 언제든지 말씀해 주세요. 😄
5점 수강평을 남겨주시면 향후 더 나은 강의를 만드는 데 큰 도움이 됩니다. 🌟
Iterable 관련 설명 중 의문점
1
71
1
DP 알고리즘 index 0 이유?
0
80
2
백준에서 queue.PriorityQueue() 사용 시 런타임에러가 납니다.
0
78
2
(시간 초과) BOJ 1342 관련하여 질문이 있습니다
1
79
2
BFS, DFS
0
102
2
이중연결리스트에 관한 수업 내용도 있을까요?
0
98
1
영상에서 설명이 잘못됐고 자막이 맞는 내용이라고 자막에 표기
0
110
2
최대값 int(1e6, 1e7, 1e8) 기준
0
269
2
섹션 3 BOJ 1342 //= 연산자 관련
0
87
3
라이브러리 사용
0
118
2
2번 구현 방법 질문 있습니다.
0
167
1
브루트 포스 풀이
0
144
2
다익스트라 음수 간선
0
158
1
종료 조건
0
117
2
BOJ 1342 메모리초과 관련
0
122
2
진짜 엄청나네요. 이 가격에 새로운 컨텐츠 추가라니
0
214
1
섹션3 브루트포스 알고리즘 1342 풀이1 질문
0
150
2
boj 3020
0
127
1
강의 내용 중 백트래킹 존재 여부
0
155
1
제가 공부하는 방법이 괜찮은지 궁금합니다
1
260
2
DP 11053관련 질문있습니다.
0
120
1
17609 투포인터 문제를 재귀로 풀 경우가 궁금합니다!
0
138
3
3020번 풀이 코드관련 질문있어요
0
171
2
재귀 관련 문제 관찰할 때 질문
0
197
1

