문제링크 : https://www.acmicpc.net/problem/7576
#include<bits/stdc++.h>
using namespace std;
int N, M;
// 토마토의 위치를 저장하는 배열
int a[1002][1002];
int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1};
// 토마토의 관한 struct
// r은 행, c는 열, val은 토마토가 익은 시간
struct Tomato{
int r, c, val;
// 습관대로 a, b, c 써서 틀려버림 변수이름 집중하기
// Tomato(int a, int b, int c){
Tomato(int z, int x, int v){
r = z;
c = x;
val = v;
}
};
int main(){
ios_base::sync_with_stdio(false);
// freopen("../input.txt","rt",stdin);
memset(a, -1, sizeof(a));
cin >> M >> N;
queue<Tomato> tom;
for(int i=1; i<=N; i++){
for(int j=1; j<=M; j++){
cin >> a[i][j];
/// 익은 토마토의 경우 queue에 넣어준다.
if(a[i][j] == 1){
tom.push(Tomato(i, j, 1));
}
}
}
//익은 토마토를 기준으로 BFS를 시작한다.
while(!tom.empty()){
Tomato k = tom.front();
tom.pop();
for(int i=0; i<4; i++){
int rr = k.r + dy[i];
int cc = k.c + dx[i];
if(a[rr][cc] == 0){
// 토마토를 익게만들고, 그 익은 시간을 배열에 넣어준다.
a[rr][cc] = k.val+1;
// cout<<rr<<" "<<cc<<" "<<a[rr][cc]<<endl;
// 시간을 1증가시킨 뒤 queue에 넣어주어 BFS를 계속한다.
tom.push(Tomato(rr,cc,k.val+1));
}
}
}
int res = -1;
// BFS가 끝나면 전체 토마토를 확인하여 최대 시간을 구한다.
// 단 토마토가 하나라도 익지 않았을 경우 -1을 출력한다.
for(int i=1; i<=N; i++){
for(int j=1; j<=M; j++){
if(a[i][j] > res) res = a[i][j];
if(a[i][j] == 0){
res = 0;
break;
}
}
if(res == 0) break;
}
cout<< res-1<<endl;
return 0;
}
문제는 익은토마토를 큐에 넣어주며 잘 풀었지만 처음에 struct를 선언할 때, 배열에서 선언한 변수인 a를 습관적으로 그냥 써버렸다. 앞으로는 스트럭트에서 처리할 때는 aa, bb, cc 등 사용하지 않을 변수의 이름으로 처리해야겠다.