🧺입력
입력은 그림의 크기를 나타내는 m과 n, 그리고 그림을 나타내는 m × n 크기의 2차원 배열 picture로 주어진다. 제한조건은 아래와 같다.
* 1 <= m, n <= 100
* picture의 원소는 0 이상 2^31 - 1 이하의 임의의 값이다.
* picture의 원소 중 값이 0인 경우는 색칠하지 않는 영역을 뜻한다.
🧺출력
리턴 타입은 원소가 두 개인 정수 배열이다. 그림에 몇 개의 영역이 있는지와 가장 큰 영역은 몇 칸으로 이루어져 있는지를 리턴한다.
🔮예제 입력
🔮예제 출력
bfs, dfs, 그래프이론, 브루트포스
(solved.ac기준) 실버I~골드IV
저는 개인적으로 bfs로 풀었습니다.
매우 쉬운문제입니다.
그냥 일반적인 bfs문제라서 크게 설명할것은없지만,
저는 브루트포스로 모든 점을 순회하면서, 만약에 그 점이 방문하지않은점이면서 0이아니라면 그 점에 대하여 bfs를 수행하도록했습니다.
#include <vector>
#include <utility>
#include <queue>
constexpr int MAX = 101;
std::vector<int> solution(int m, int n, std::vector<std::vector<int>> picture) {
int number_of_area = 0;
int max_size_of_one_area = 0;
const int dx[4] = { 0, 0, 1, -1 };
const int dy[4] = { 1, -1, 0, 0 };
bool visit[MAX][MAX] = { false, };
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(!visit[i][j] && picture[i][j] != 0) {
++number_of_area;
std::queue<std::pair<int, int>> q;
q.push({ i, j });
visit[i][j] = true;
int result = 1;
while(!q.empty()){
int y = q.front().first;
int x = q.front().second;
q.pop();
for(int i=0;i<4;++i){
int ny = y + dy[i];
int nx = x + dx[i];
if(ny >= 0 && nx >= 0 && ny < n && nx < m){
if(!visit[ny][nx] && picture[ny][nx] == picture[y][x]){
visit[ny][nx] = true;
q.push({ ny, nx });
++result;
}
}
}
}
max_size_of_one_area = std::max(result, max_size_of_one_area);
}
}
}t
std::vector<int> answer(2);
answer[0] = number_of_area;
answer[1] = max_size_of_one_area;
return answer;
}
우선은 저가 프로그래머스에서 문제를 처음 풀어봐가지고, 적응이 안되네요.
쉬운문제임에도 불구하고, 입출력예시를 짜증나게줘서 혼동이 갔습니다.
입출력예시를 기존 c++ std::vector<std::vector<int>>의 1차원자리와 2차원자리를 반대로 줬습니다. 화나네요.
원래 c++ std::vector<std::vector<int>>의 자리에 그대로 대입하려면,
{{1, 1, 1, 0, 0, 0}, {1, 2, 0, 0, 0, 0}, {1, 2, 0, 0, 0, 0}, {0, 0, 1, 1, 3, 3}}
이게 맞는건데,
{{1, 1, 1, 0}, {1, 2, 2, 0}, {1, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 3}, {0, 0, 0, 3}}
이걸로줘서 매우 화납니다.
이것때문에 코드는 진작에 5~7분만에 만들어놓고, 30분헤맸습니다.
저는 m이 6이고, n이 4이길래 n이 x좌표의 최댓값이고 m이 y좌표의 최댓값인줄알았습니다. 하....
반대로하니까 되네요.. 시1발
개인적인생각으로 문제는 백준이 더 유연하고, 가독성이 좋은듯합니다.
궁금한 부분있으시면 댓글로 질문주세요~