이 문제의 포인트는 토마토가 동시 다발적으로 퍼져 나간다는것이다. 즉 처음부터 토마토가 있는 지점들을 저장해놓고 시작해야하는게 핵심이다.
맵을 입력 받을 때 토마토 지점을 큐에 넣고 빈큐가 될 때 까지 돌린다.
초기에 현재 토마토 값 + 1을 해줘서 그 지점이 몇일째 토마토가 된건지 표시 해주는것이다. 그리고 더 이상 퍼져나갈 토마토가 없으면 종료.
그리고 맵을 돌며 안익은 토마토가 있다면 -1을 출력해주고 그외 최대값을 갱신해주자.
그리고 최대값에서 -1을 해주면 몇일이 걸렸는지 확인 가능
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int maps[1001][1001];
int main() {
int n, m;
cin >> m >> n;
queue<pair<int, int>> q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> maps[i][j];
if (maps[i][j] == 1) {
q.push({ i, j });
}
}
}
int ans = 0;
while (!q.empty()) {
int cx = q.front().first;
int cy = q.front().second;
q.pop();
for (int d = 0; d < 4; d++) {
int nx = cx + dx[d];
int ny = cy + dy[d];
if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
if (maps[nx][ny] == 0) {
maps[nx][ny] = maps[cx][cy] + 1;
q.push({ nx, ny });
}
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (maps[i][j] == 0) {
cout << -1 << endl;
return 0;
}
if (ans < maps[i][j])
ans = maps[i][j];
}
}
cout << ans - 1 << endl;
}'코딩테스트' 카테고리의 다른 글
| 백준 노드사이의 거리 (0) | 2025.12.27 |
|---|---|
| 백준 보물섬 (0) | 2025.12.21 |
| 코딩테스트 백준 1916 (1) | 2025.12.07 |
| Codility 사용법 (3) | 2025.06.15 |
| java 코딩테스트 time out (0) | 2025.02.09 |