전~형적인 BFS 문제.
BFS를 대표하는 문제라고도 할 수 있겠다.
아래 그림은 두 개의 영역으로 구성돼 있고, 각각의 크기는 6,4 이다.
이것을 그러면 코드로 어떻게 판단할 것이냐?
브루트포스로 처음부터 끝까지 돌면서,
0보다 큰 수를 만났을 때 BFS를 돌리는 것이다.
그러면 상하좌우에 있는 같은 색깔을 모두 count하게 되고,
모든 주변의 색깔을 count했다면 해당 count가 max인 값이 answer의 두 번째 인자가 된다.
이 때 이미 검사한 타일은 따로 저장해두면서 지나가야 한다.
(BFS를 잘 설명해놓은 곳 -> https://blog.encrypted.gg/941?category=773649)
1110
1110
0001
0001
0001
0001
#include <bits/stdc++.h>
using namespace std;
int board[101][101];
int dist[101][101];
queue<pair<int, int>> Q;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int sizeOfColor;
// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
vector<int> solution(int m, int n, vector<vector<int>> picture) {
int number_of_area = 0;
int max_size_of_one_area = 0;
for (int i = 0; i < 101; i++)
fill(dist[i], dist[i] + 101, 0);
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
board[i][j] = picture[i][j];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (board[i][j] == 0 || dist[i][j] >= 1)
continue;
// BFS 시작.
Q.push({i, j});
number_of_area++;
int color = board[i][j];
dist[i][j] = 1;
sizeOfColor = 1;
while (!Q.empty())
{
auto t = Q.front();
Q.pop();
for (int dir = 0; dir < 4; dir++)
{
int nx = t.first + dx[dir];
int ny = t.second + dy[dir];
if (nx < 0 || nx >= m || ny < 0 || ny >= n)
continue;
if (board[nx][ny] != color || dist[nx][ny] >= 1)
continue;
dist[nx][ny] = 1;
Q.push({nx, ny});
sizeOfColor++;
}
}
max_size_of_one_area = max(max_size_of_one_area, sizeOfColor);
}
}
vector<int> answer(2);
answer[0] = number_of_area;
answer[1] = max_size_of_one_area;
return answer;
}
'Algorithm' 카테고리의 다른 글
프로그래머스 - 게임 맵 최단거리 [C++] (0) | 2021.06.05 |
---|---|
프로그래머스 단체사진 찍기 c++ (0) | 2021.05.29 |
프로그래머스 크레인 인형뽑기 게임 c++ (0) | 2021.05.28 |
프로그래머스[c++] 로또의 최고 순위와 최저 순위 (0) | 2021.05.25 |
프로그래머스 - 카펫 c++ (0) | 2021.05.23 |
최근댓글