그래프

[백준] 7576. 토마토 풀이

hch06 2025. 2. 11. 22:06

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

 

입력받은 값에서 1을 찾은 후 1에서부터 탐색해나가며 각 위치의 탐색 깊이를 저장해야하는 문제이다.

 

1이 여러개일 수 있기 때문에 각 1에 대해서 탐색을 진행해야하나 싶었지만 bfs탐색 중 큐에 1의 위치들을 한번에 넣고 돌리면 동시에 탐색이 가능해진다.

즉, 1의 위치마다 다시 탐색할 필요가 없어진다.

 

따라서 반복문으로 1의 위치를 큐에 집어넣은 후 탐색 중 값이 0인 부분이 있다면 바로 이전 탐색 값에 +1을 하여 저장하는 방식으로 깊이를 저장하였다.

 

최총적으로 탐색을 마친 후 값들 중에 0이 존재하면 모든 토마토가 익은 것이 아니므로 -1을 출력하고, 존재하지 않으면 값들 중 최대값을 출력하여서 문제를 해결하였다. (만약 값이 -1을 제외하고 1밖에 없다면 이미 모든 토마토가 익어있는 상태이므로 0을 출력한다.)

 


C

더보기
#include <stdio.h>
#define MaxSize 10000000

int l[1000][1000];
int d[2] = {-1, 1};

// Queue
typedef struct{
    int data[MaxSize];
    int len;
    int front;
    int rear;
} Queue;
void initQueue(Queue* q){
    q->len = 0;
    q->front = 0;
    q->rear = 0;
}
int popleft(Queue* q){
    if(q->len > 0){
        int res = q->data[q->front];
        q->front += 1;
        q->len -= 1;
        if(q->front == MaxSize) q->front = 0;
        return res;
    }
}
void append(Queue* q, int v){
    int idx = q->rear;
    q->data[idx] = v;
    q->rear += 1;
    q->len += 1;
    if(q->rear == MaxSize) q->rear = 0;
}

void BFS(int n, int m){
    Queue q;
    initQueue(&q);

    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(l[i][j] == 1) {
                append(&q, i);
                append(&q, j);
            }
        }
    }

    while(q.len > 0){
        int v[2];
        v[0] = popleft(&q); // y
        v[1] = popleft(&q); // x

        for(int i = 0; i < 2; i++){
            if (v[0] + d[i] < 0 || v[0] + d[i] >= n) continue;
            if(l[v[0] + d[i]][v[1]] == 0){
                append(&q, v[0]+d[i]);
                append(&q, v[1]);
                l[v[0] + d[i]][v[1]] = l[v[0]][v[1]]+1;
            }
        }
        for(int i = 0; i < 2; i++){
            if (v[1] + d[i] < 0 || v[1] + d[i] >= m) continue;
            if(l[v[0]][v[1] + d[i]] == 0){
                append(&q, v[0]);
                append(&q, v[1]+d[i]);
                l[v[0]][v[1] + d[i]] = l[v[0]][v[1]]+1;
            }
        }
    }
}

int main() {
    int m, n; scanf("%d %d", &m, &n);

    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++) scanf("%d", &l[i][j]);
    }
    BFS(n, m);

    int mx = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if (l[i][j] > mx) mx = l[i][j];
            if (l[i][j] == 0) {printf("-1"); return 0;}
        }
    }
    printf("%d", mx-1);
}

Python

더보기
from collections import deque

d = [-1, 1]
def bfs(tomato):
    q = deque()
    for i in tomato:
        q.append(i)

    while len(q) > 0:
        v = q.popleft() # v[0] -> y, v[1] -> x

        for i in range(2):
            if l[v[0] + d[i]][v[1]] == 0:
                q.append([v[0]+d[i], v[1]])
                l[v[0]+d[i]][v[1]] = l[v[0]][v[1]]+1
        for i in range(2):
            if l[v[0]][v[1] + d[i]] == 0:
                q.append([v[0], v[1]+d[i]])
                l[v[0]][v[1] + d[i]] = l[v[0]][v[1]]+1

m, n = map(int, input().split())
l = []
l.append([-1 for _ in range(m+2)])
for i in range(n):
    v = list(map(int, input().split()))
    v.insert(0, -1)
    v.append(-1)
    l.append(v)
l.append([-1 for _ in range(m+2)])

tomato = []
cnt = 0
for i in range(1, n+1):
    for j in range(1, m+1):
        if l[i][j] == 1:tomato.append([i, j])
bfs(tomato)

mx = 0
for i in range(1, n + 1):
    for j in range(1, m + 1):
        if l[i][j] > mx: mx = l[i][j]
        if l[i][j] == 0: mx = 2000000
print(mx-1 if mx != 2000000 else -1)