bfs + queue를 사용할 줄 알면 굉장히 쉬운 문제이다.
문제 시작하면 전역변수를 사용할 때 무조건 값을 초기화하고 사용해달라고 했는데, 실수로 이 주석을 지우고 코드를 짜다가 visit 배열을 초기화 안하고 사용했다가 제출했다가 틀리고 삽질 조금 했다;
전역변수는 0으로 초기화되는게 C의 기본인데 왜 굳이 이런 제한을 걸어놓는지 도무지 이해가 안된다...
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int rowDir[4] = { -1, 1, 0, 0 };
int colDir[4] = { 0, 0, -1, 1 };
int row_size;
int col_size;
int visit[128][128];
typedef struct __pos {
int row;
int col;
}pos;
int bfs(const vector<vector<int>> &picture, int row, int col)
{
int area = 0;
int base = picture[row][col];
queue<pos> q;
q.push( {row, col} );
while(1) {
if(q.empty())
break;
pos cur = q.front(); q.pop();
if(visit[cur.row][cur.col])
continue;
visit[cur.row][cur.col] = 1;
area++;
for(int i=0;i<4;i++) {
int nrow = cur.row + rowDir[i];
int ncol = cur.col + colDir[i];
if(nrow < 0 || ncol < 0 || nrow > row_size - 1 || ncol > col_size - 1)
continue;
if(visit[nrow][ncol])
continue;
if(picture[nrow][ncol] != base)
continue;
q.push({nrow, ncol});
}
}
return area;
}
vector<int> solution(int m, int n, vector<vector<int>> picture) {
int number_of_area = 0;
int max_size_of_one_area = 0;
row_size = m;
col_size = n;
for(int i=0;i<128;i++)
for(int j=0;j<128;j++)
visit[i][j] = 0;
for(int i=0;i<row_size;i++) {
for(int j=0;j<col_size;j++) {
if(picture[i][j] == 0)
continue;
if(visit[i][j] == 0) {
max_size_of_one_area = max(max_size_of_one_area, bfs(picture, i, j));
number_of_area++;
}
}
}
vector<int> answer(2);
answer[0] = number_of_area;
answer[1] = max_size_of_one_area;
return answer;
}