[#9][알고리즘] 카카오 코드 페스티벌 예선 - 카카오 프렌즈 컬러링북 풀이(Flood fill 알고리즘)

카카오 코드 페스티벌 예선 > 카카오 프렌즈 컬러링북 풀이(Flood fill 알고리즘)

Flood fill : 경계 내의 어떤 영역을 특정한 색으로 칠하는 문제(재귀 이용)

C++ 풀이
#include <vector>
using namespace std;
vector<vector<int>> pic;
int ff(int m, int n, int color) {
    int area = 1// color가 0이 아니기 때문
    
    if (n > 0 && color == pic[m][n-1]) {
        // left
        pic[m][n] = 0// color가 같은지 확인 후 색 지워버리기
        area += ff(m, n - 1, color);
    }
    if (n < pic[0].size() - 1 && color == pic[m][n + 1]) {
        // right
        pic[m][n] = 0;
        area += ff(m, n + 1, color);
    }
    if (m > 0 && color == pic[m - 1][n]) {
        // above
        pic[m][n] = 0;
        area += ff(m - 1, n, color);
    }
    if (m <  pic.size() - 1 && color == pic[m + 1][n]) {
        // below
        pic[m][n] = 0;
        area += ff(m + 1, n, color);
    }
    
    pic[m][n] = 0// 주변에 같은 색이 없는 경우
    return area;
}
// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
vector<int> solution(int m, int n, vector<vector<int>> picture) {
    int number_of_area = 0;
    int max_size_of_one_area = 0;
    int size = 0;
    pic = picture;
    vector<int> answer(2);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j <n; j++) {
            if (pic[i][j] != 0) {
                size = ff(i, j, pic[i][j]);
                // 영역이 존재한다.
                number_of_area++;
                // 반환된 최대 영역 크기 중 max를 찾는다.
                if (max_size_of_one_area < size) max_size_of_one_area = size;
            }
        }
    }
    answer[0= number_of_area;
    answer[1= max_size_of_one_area;
    return answer;
}
cs

댓글

가장 많이 본 글