카카오프렌즈 컬러링북(Lv2)
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
int dirX[] = { -1,0,1,0 };//x축 좌표들
int dirY[] = { 0,-1,0,1 };//y축 좌표들
bool vvVisited[101][101];
//m:전체 x사이즈 row
//n:전체 y사이즈 column
//a:picture 좌표 x
//b:picture 좌표 y
int BFS(int m, int n, int x, int y, vector<vector<int>> picture)
{
int iCurrentNum = picture[x][y];//인접 행렬들이 이 숫자들과 같아야한다.
int answer = 1;
int nx; int ny;
queue<pair<int, int>> qCon;
qCon.push(make_pair(x, y));
vvVisited[x][y] = true;
while (!qCon.empty())
{
int x = qCon.front().first;
int y = qCon.front().second;
qCon.pop();
for (int i = 0; i < 4; i++)
{
nx = x + dirX[i];
ny = y + dirY[i];
// 하기의 조건문은.
//방문하지 않은 상태이며
//인접한 부분들과 색이 일치하는 경우입니다.
if (nx >= 0 && nx < m && ny >= 0 && ny < n && vvVisited[nx][ny] == false && iCurrentNum == picture[nx][ny])
{
vvVisited[nx][ny] = true;
qCon.push(make_pair(nx, ny));
answer++;//인접한 부분들과 색이 일치하는 경우 return value ++;해준다.
}
}
}
return answer;
}
// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
vector<int> solution(int m, int n, vector<vector<int>> picture) {
int number_of_area = 0;
int max_size_of_one_area = 0;
vector<int> vmaxSize;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
vvVisited[i][j] = false;
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{//숫자가 0이 아니어야함.
if ((picture[i][j] != 0) && (vvVisited[i][j] == false))//방문 안해야 하고, 숫자가
{//vvVisited는 위에서 BFS 에서 방문처리 하게된다.
int iTemp = BFS(m, n, i, j, picture);
vmaxSize.push_back(iTemp);
number_of_area++;// BFS 를 통해 인접 행렬들의 몇개의 영역이 있는지 알아내게 된다.
//BFS를 통해 인접 행렬들이 아닌 경우에는
}
}
}
sort(vmaxSize.begin(), vmaxSize.end(), cmp);
vector<int> answer(2);
answer[0] = number_of_area;
answer[1] = vmaxSize[0];
return answer;
}
int main()
{
vector<vector<int>> vTemp = { {1, 1, 1, 0},{1, 2, 2, 0},{1, 0, 0, 1},{0, 0, 0, 1},{0, 0, 0, 3},{0, 0, 0, 3} };
int x = 6;
int y = 4;
vector<int> vResult;
vResult = solution(x, y, vTemp);
}
질좋은 문제. 설명은 주석으로
BFS할 때 이런 queue.push 이후,
하나씩 팝하면서
x,y 좌표계 이동하고
bool btmp 2차원에 true 주며 방문기록 체크하는 방식 중요하다.
queue에서 처음꺼 팝하고,
팝한부분에서 BFS 로 주변살피고,
트정조건(문제에서 나옴 - x,y범위를 넘치지 않아야하며, 문제에서 주는 조건들 만족한다)
방문기록 하고,
BFS를 다시 하기 위해 다시 push 한다.
전체 while문은 (!queue.empty())
으로 이런 스타일의 BFS 알아놔야함
Author And Source
이 문제에 관하여(카카오프렌즈 컬러링북(Lv2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@imalive77/카카오프렌즈-컬러링북Lv2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)