[구름톤 챌린지] DAY 13 발전기(2)

OOING·2023년 8월 30일
0

백준+알고리즘 공부

목록 보기
29/75

문제

입력

입출력 예시

코드

#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 해주고, 이를 모든 건물에 대해 확인한다.

profile
HICE 19

0개의 댓글