프로그래머스(Programmers)

카카오프렌즈 컬러링 북 C++

cosmohoo 2021. 12. 28. 10:45
반응형

문제설명

 

예제 입출력

m       n       picture                                                                                                                                                       answer

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]

예제에 대한 설명

예제로 주어진 그림은 총 4개의 영역으로 구성되어 있으며, 왼쪽 위의 영역과 오른쪽의 영역은 모두 1로 구성되어 있지만 상하좌우로 이어져있지 않으므로 다른 영역이다. 가장 넓은 영역은 왼쪽 위 1이 차지하는 영역으로 총 5칸이다.

 

 

 

#include <vector>
#include <iostream>
#include <algorithm> 
#include <cstring>

using namespace std;

int arr[101][101];
int UpDownLeftRight [4][2] ={{1,0},{-1,0},{0,1},{0,-1} };
vector<vector<int>> pic;
int M,N;

int dfs(int x,int y, int cnt )//x는 행 Y는 열
{
    
    arr[x][y]=true;
    
    for(int i=0; i<4;i++)
    {    
        int nextX = x + UpDownLeftRight[i][0];
        int nextY = y + UpDownLeftRight[i][1];
        
        if(nextX<0||nextX>=M|nextY<0||nextY>=N) continue;
        
        if(pic[x][y]==pic[nextX][nextY] && arr[nextX][nextY]==false)
        {
            cnt = dfs(nextX, nextY, cnt+1);            
        }
    }
    return cnt;
}

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
vector<int> solution(int m, int n, vector<vector<int>> picture) {
    int number_of_area = 0;
    int max_size_of_one_area = 0;
    pic = picture;
    M=m;N=n;
    
    memset(arr,0,sizeof(arr));
    
    for(int i=0; i<m; i++)
    {
        for(int j=0; j<n; j++)
        {
            if(!arr[i][j] && picture[i][j] !=0)
            {
                number_of_area++;
                max_size_of_one_area = max(max_size_of_one_area,dfs(i,j,1));
            }
        }
    }
        
    vector<int> answer(2);
    answer[0] = number_of_area;
    answer[1] = max_size_of_one_area;
    return answer;
}

 

 

=> DFS나 BFS를 사용하여 풀어야 하는 문제였습니다. 

=> picture를 탐색시작하며 해당 값이 0이 아닐 경우부터 해당 값을 가지고 있는 상하좌우의 경우를 확인하였습니다.(DFS)

=> 이를 통해 첫 번째 값이 1일 경우, 1로 이루어진 구역의 모든 부분을 체크합니다. 

=> 이후, 체크되지 않은 부분을 탐색하며 다시 0이 아닌 경우를 확인하여 DFS를 재실행합니다. 

**코딩하며 틀린 부분 : UpDownLeftRight를 더해야 하는데 바보같이 arr의 값을 더하고 있었습니다. 

***BFS로도 풀어보겠습니다. 

반응형