STUDY/Algorithm

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

sinawi95 2021. 6. 21. 13:08
728x90

https://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

#include <vector>
#include <queue>
using namespace std;

int bfs(int r, int c, bool visit[100][100],
         int m, int n, vector<vector<int>> picture)
{
    int value = picture[r][c];
    int count = 0;
    int dx[] = {-1,1,0,0};
    int dy[] = {0,0,-1,1};
    queue <pair<int,int>> q;
    q.push({r,c});
    while (!q.empty())
    {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        if (visit[x][y]) continue;
        visit[x][y] = true;
        ++count;
        for (int i=0; i< 4; ++i)
        {
            int xx = x+dx[i];
            int yy = y+dy[i];
            if (xx<0 || xx >= m || yy<0 || yy>=n) continue;
            if (visit[xx][yy] || picture[xx][yy] != value) continue;
            q.push({xx, yy});
            
        }
    }
    return count;
}

vector<int> solution(int m, int n, vector<vector<int>> picture) {
    int number_of_area = 0;
    int max_size_of_one_area = 0;
    
    vector<int> answer(2);
    answer[0] = number_of_area;
    answer[1] = max_size_of_one_area;
    
    bool visit[100][100]={false};
    
    for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j <n; ++j)
        {
            if (picture[i][j] && !visit[i][j])
            {
                ++answer[0];
                int tmp = bfs(i, j, visit, m, n, picture);
                if (answer[1] < tmp)
                    answer[1] = tmp;
            }
        }
    }
    return answer;
}

 

같은 그림(색깔?) 일때만 BFS가 돌아가게 만들면된다.

다만.. C++이 더 어려웠다.

vector와 queue를 사용하는 방법을 몰라서 한참을 헤맸다.