Problem Solving/Programmers
Programmers [2017 카카오코드 예선]: 카카오프렌즈 컬러링북
이진2
2020. 12. 31. 00:34
programmers.co.kr/learn/courses/30/lessons/1829#
코딩테스트 연습 - 카카오프렌즈 컬러링북
6 4 [[1, 1, 1, 0], [1, 2, 2, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 3], [0, 0, 0, 3]] [4, 5]
programmers.co.kr
배열 내의 Connected Component의 개수를 구한 뒤, 가장 원소를 많이 가진 연결요소의 원소 수를 구하면 된다!!
#include <vector>
#include <queue>
using namespace std;
int N,M,dx[] = { 1,0,-1,0 }, dy[] = { 0,1,0,-1 };
bool visit[101][101];
typedef struct { int x, y; }point;
bool safe(int x, int y) { return x >= 0 && x < M && y >= 0 && y < N; }
// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
vector<int> solution(int n, int m, vector<vector<int>> picture) {
int number_of_area = 0;
int max_size_of_one_area = 0;
int arr[101][101];
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
arr[i][j]=picture[i][j];
visit[i][j]=false;
}
N = n; M = m;
for (int i = 0; i < n; i++)for (int j = 0; j < m; j++) {
if (visit[i][j] || !arr[i][j])continue;
number_of_area++;
int color = arr[i][j],size=0;
queue<point> q;
q.push({ j,i });
visit[i][j] = 1;
while(!q.empty()) {
size++;
point cur = q.front(); q.pop();
for (int k = 0; k < 4; k++) {
int nx = cur.x + dx[k], ny = cur.y + dy[k];
if (!safe(nx, ny) || visit[ny][nx] || arr[ny][nx] != color)continue;
q.push({ nx,ny });
visit[ny][nx] = 1;
}
}
if (size > max_size_of_one_area)
max_size_of_one_area = size;
}
vector<int> answer(2);
answer[0] = number_of_area;
answer[1] = max_size_of_one_area;
return answer;
}
참 쉽죠?