본문 바로가기

스터디 1일 1커밋

240408 [BOJ/백준] 7576. 토마토

https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net


나의 코드

from collections import deque

M, N = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
visited = [[0]*M for _ in range(N)]
di = [0, 1, 0, -1]
dj = [1, 0, -1, 0]
q = deque()
day = 0

for i in range(N):
    for j in range(M):
        if arr[i][j] == 1:
            q.append([i, j, day])
            visited[i][j] = 1  # 방문 표시
            # arr[i][j] = 1  # 토마토가 익는다.

while q:
    x, y, day = q.popleft()
    for k in range(4):
        ni = x + di[k]
        nj = y + dj[k]
        if 0 <= ni < N and 0 <= nj < M and arr[ni][nj] == 0 and visited[ni][nj] == 0:
            arr[ni][nj] = arr[x][y] + 1  # 토마토가 익는 데 전 토마토보다 +1한 값 재할당
            visited[ni][nj] = 1
            q.append([ni, nj, day+1])

for i in arr:
    if 0 in i:
        print(-1)
        break

else:
    print(day)  # 걸린 시간 출력

 

결과


첫번째 실수

for i in range(N):  # 한번 둘러보고 안익은 토마토가 없다면
    if 0 not in arr[i]:
        print(0)  # 0일 출력 후 프로그램 종료
        exit(0)

익은 토마토만 존재할 때를 구하려고 이 코드를 제일 먼저 돌도록 했는데 arr는 이차배열이어서 첫번째 배열만 보고 그 리스트에 0이 없다면 0을 출력하고 프로그램을 끝낸다는 허점이 있었다.

그것은 익은 토마토만 존재하면 모든 토마토가 익는데 걸리는 시간을 구하면서 자연스럽게 구할 수 있는 부분이었다. 그래서 위의 코드를 삭제함으로써 해결!

 

두번째 실수

이것은 추리하기로 성공코드에서는 값을 넣고 빼면서 날짜도 같이 넣어주고 뺐는데 그 전의 코드는 값을 넣고 빼면서 날짜는 그냥 arr의 값에 1씩 더해주는 걸로 구했다. 언젠가 그런식으로 하면 꼬일 수도 있어서 구하려는 값을 같이 갖고 다니는게 낫다는 얘기를 들어서 그 부분으로 해결! 근데 아직도 어디서 꼬인지는 잘 모르겠다...ㅎㅎ 아무튼 생각보다 깔끔하게 짠 코드로 문제 해결!