#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
int N, K;
vector<vector<int>> city, visit;
int complex[31];
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
bool bfs(int x, int y) {
int cnt = 1, now = city[x][y];
queue<pair<int, int>> q;
q.push({x, y});
visit[x][y] = 1;
while(!q.empty()) {
int nowx = q.front().first;
int nowy = q.front().second;
q.pop();
for(int i = 0; i < 4; i++) {
int nextx = nowx + dx[i];
int nexty = nowy + dy[i];
if(nextx > 0 && nextx <= N && nexty > 0 && nexty <= N) {
if(city[nextx][nexty] == now && !visit[nextx][nexty]){
q.push({nextx, nexty});
visit[nextx][nexty] = 1;
++cnt;
}
}
}
}
return cnt >= K ? true : false;
}
int bfsAll() {
int max = 0, maxNum = 0; // max는 가장 많은 단지의 수, maxNum은 가장 많은 단지가 있는 건물물 유형(번호)
for(int i = 1; i <= N; i++){
for(int j = 1; j <= N; j++){
if(!visit[i][j]){
if(bfs(i, j)) ++complex[city[i][j]];
}
}
}
for(int i = 1; i <= 30; i++) {
if(complex[i] > max) {
max = complex[i];
maxNum = i;
}
}
return maxNum;
}
int main() {
cin >> N >> K;
city = vector<vector<int>>(N + 1, vector<int>(N + 1, 0));
visit = vector<vector<int>>(N + 1, vector<int>(N + 1, 0));
memset(complex, 0, sizeof(complex));
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
cin >> city[i][j];
}
}
cout << bfsAll();
return 0;
}
미치겠다
처음에 문제 이해를 잘못해서 무작정 개수가 가장 많은 녀석을 출력했다가..
K를 안 썼음을 확인하고 다시 확인했다😅
bfs
에서는 현재 확인하는 건물이 단지인지 확인하고, bfsAll
에서는 현재 확인한 건물이 단지이면 해당 유형의 단지 개수를 +1 해주고, 이를 모든 건물에 대해 확인한다.