본문 바로가기

About/Algorithm

[프로그래머스][C++] 카카오 프렌즈 컬러링 북

출처 프로그래머스

https://programmers.co.kr/

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2017 카카오 코드 예선 문제이다.

4방향 순회를 재귀함수로 구현하여 문제를 해결하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <vector>
#define NON_COLOR 0
 
using namespace std;
int traversal(vector<vector<bool>>& check,vector<vector<int>>& picture, int color,int count,int row, int column) {
 
    if (color != picture[row][column] || check[row][column] == true)
        return 0;
 
    check[row][column] = true;
    if(column != picture[0].size()-1)
        count += traversal(check, picture, color, 0, row, column +1);
    if(column != 0)
        count += traversal(check, picture, color, 0, row, column -1);
    if(row != picture.size()-1)
        count += traversal(check, picture, color, 0, row +1, column);
    if(row != 0)
        count += traversal(check, picture, color, 0, row -1, column);
    return count+1;
}
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;
    vector<vector<bool>> already_check(m, vector<bool>(n,false));
 
    for (int row = 0; row < m; row++) {
        for (int column = 0; column < n; column++) {
            if (already_check[row][column] || picture[row][column] == NON_COLOR)
                continue;
            size = traversal(already_check, picture, picture[row][column], 0, row, column);
            if (max_size_of_one_area < size
                max_size_of_one_area = size;
            if (size != 0)
                number_of_area++;
            size = 0;
        }
    }
    vector<int> answer(2);
    answer[0= number_of_area;
    answer[1= max_size_of_one_area;
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

vector<vector<bool>> already_check(m, vector<bool>(n,false));

already check 라는 bool vector를 만들어 이미 방문한 영역을 표시하였고

 

int traversal(vector<vector<bool>>& check,vector<vector<int>>& picture, int color,int count,int row, int column)에서

재귀함수로 traversal 함수를 구성하여 상하좌우 모두 탐색하게 하였다.

방문한 영역이 기존영역의 색깔과 다르거나 방문한 영역이 기존에 이미 방문한 영역일 때 재귀를 중단하였다.

 

  for (int row = 0; row < m; row++) {

        for (int column = 0; column < n; column++) {

            if (already_check[row][column] || picture[row][column] == NON_COLOR)

                continue;

            size = traversal(already_check, picture, picture[row][column], 0, row, column);

            if (max_size_of_one_area < size

                max_size_of_one_area = size;

            if (size != 0)

                number_of_area++;

            size = 0;

        }

    }

solution의 이중포문에서

이미 방문한 영역이거나 NON_COLOR (picture값이 0)인 경우엔 순회를 하지 않았으며

 

순회 후 사이즈와 max_size_of_one_area 를 비교하여 max_size를 갱신하여 가장 큰 영역의 넓이를 계산하였고,

 

size가 0이 아닌 경우엔 새로운 영역을 찾은 것이라 판단하여 number_of_area에 1을 더해주었다.