알고리즘/카카오 문제풀이

[2017 카카오코드 예선] 카카오 프렌즈 컬러링북

전태경 2020. 9. 20. 13:32

문제

programmers.co.kr/learn/courses/30/lessons/1829

 

코딩테스트 연습 - 카카오프렌즈 컬러링북

6 4 [[1, 1, 1, 0], [1, 2, 2, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 3], [0, 0, 0, 3]] [4, 5]

programmers.co.kr

문제설명

이 문제의 핵심질문은 그림판에 색칠된 영역들을 구할 수 있냐? 구분할 수 있냐? 로 정리할 수 있다.

"영역의 크기"를 구하기 위해선 우리가 알고 있는 방법은 당연 DFS, BFS 이다.

DFS, BFS 관련된 문제와 설명들은 구글링을 통해서 쉽게 접할 수 있을 것이다.

 

우선 모든 picture의 위치(i, j)에 접근하여 해당 위치가 영역체크를 하였는지에 대해 visited 배열에 저장을 하였다.

영역체크가 되어있지 않으면 BFS를 통해 해당영역의 크기를 구하고 영역의 개수를 늘려가는 방식으로 진행하였다.

 

코드

#include <vector>
#include <algorithm>
#include <queue>
#define MAX		101
using namespace std;

bool visited[MAX][MAX];
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, -1, 0, 1 };

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
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 < MAX; i++)
    {
        for (int j = 0; j < MAX; j++)
        {
            visited[i][j] = false;
        }
    }

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            int area = 0;
            int color = picture[i][j];
            if (!visited[i][j] && color != 0)
            {
                visited[i][j] = true;
                number_of_area++;

                queue<pair<int, int>> q;
                q.push(make_pair(i, j));
                area++;
                
                while (!q.empty())
                {
                    int x = q.front().first;
                    int y = q.front().second;
                    q.pop();

                    for (int k = 0; k < 4; k++)
                    {
                        int nx = x + dx[k];
                        int ny = y + dy[k];

                        if (nx < 0 || nx >= m || ny < 0 || ny >= n)
                            continue;

                        if (!visited[nx][ny] && picture[nx][ny] == color)
                        {
                            visited[nx][ny] = true;
                            q.push(make_pair(nx, ny));
                            area++;
                        }
                    }
                }
            }

            max_size_of_one_area = max(max_size_of_one_area, area);
        }
    }   
		
    vector<int> answer(2);
    answer[0] = number_of_area;
    answer[1] = max_size_of_one_area;
    return answer;
}