ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카카오프렌즈 컬러링 북 C++
    프로그래머스(Programmers) 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로도 풀어보겠습니다. 

    반응형

    '프로그래머스(Programmers)' 카테고리의 다른 글

    짝지어 제거하기 C++  (0) 2021.12.31
    체육복 C++  (0) 2021.12.30
    더 맵게 C++  (0) 2021.12.23
    멀쩡한 사각형 C++  (0) 2021.12.17
    내적 C++  (0) 2021.12.15

    댓글

Designed by Who.