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

백준 7576번 문제 정리글 입니다.

문제 출처-https://www.acmicpc.net/problem/7576

문제 내용

백준 7576번

나의 풀이

    import sys
    from collections import deque
    input=sys.stdin.readline

    def bfs():
        zero_count=0
        queue=deque()
        for i in range(n):
            for j in range(m):
                if box[i][j]==1:
                    queue.append((i,j,0))
                if box[i][j]==0:
                    zero_count+=1

        if zero_count==0:
            return print(0)

        temp_count=0
        while queue:
            x,y,day=queue.popleft()
            for i in range(4):
                rx,ry=x+dx[i],y+dy[i]
                if 0<=rx<n and 0<=ry<m and box[rx][ry]==0:
                    box[rx][ry]=1
                    temp_count+=1
                    queue.append((rx,ry,day+1))

        if zero_count==temp_count:
            return print(day)
        else:    
            return print(-1)

    m,n=map(int,input().split())
    box=[list(map(int,input().split())) for _ in range(n)]
    dx=[1,-1,0,0]
    dy=[0,0,1,-1]

    bfs()
  1. 초기 익은 토마토들의 위치와 날짜를 큐에 넣어주고 익지 않은 토마토들의 개수를 세어준다.
  2. 이 때, 익지 않은 토마토가 없으면 0을 출력한다.
  3. 익지 않은 토마토가 존재하면 BFS로 익지 않은 토마토들을 익게 만들고 익은 토마토의 개수를 세어준다.
  4. 탐색이 종료되면 처음 익지않은 토마토들이 모두 익었으면 최소 날짜수를 출력하고, 그렇지 않으면 -1을 출력한다.

익지 않은 토마토의 수를 기준으로 조건을 나눠줬다…

풀이를 본 후

0의 개수(익지 않은 토마토의 개수)를 굳이 세지 않고 배열에 1씩 값을 더해가면서 최종적인 배열의 최대값-1로 최소 일수를 구해준다…

이 때, 최종 배열에 0이 있으면 -1을 출력한다. 또한, 어차피 0이 없을 때는 배열의 최대값은 1이기 때문에 0을 출력하는 상황도 해결된다…

그런데 내 풀이가 메모리와 시간이 조금더 좋게 나왔다…^^

해결한 후

항상 많은 상황을 생각하고 해결하도록 고민을 많이 하는것이 좋은것 같다.

참조 링크