코딩 공부/프로그래머스

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

김 정 환 2021. 3. 14. 14:37
반응형

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

 

 

 

알고리즘 종류

    - BFS

 

 

사고 과정

    1. 2중 for문으로 picture를 탐색한다.

        1-1. 이미 방문했거나 색이 칠해지지 않았으면 탐색하지 않는다.

    2. 탐색할 위치의 y와 x를 찾았으면, BFS를 수행한다.

        2-1. 이동할 때 가용한 범위에 있는지 확인한다.

        2-2. 같은 색인지 확인한다.

        2-3. 이미 방문했는지 확인한다.

    3. BFS 탐색이 끝났으면, 최대 영역의 값을 갱신한다.

 

 

 

구현(C++)

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <vector>
#include <iostream>
#include <cstring>
#include <queue>
 
using namespace std;
 
int N, M;
int isVisited[101][101];
 
int dir[4][2= {{1,0}, {0,1}, {-1,0}, {0,-1}};
 
 
bool isValid(int y, int x){
    return (x>=0 && x<N) && (y>=0 && y <M);
}
 
int bfs(int y, int x, vector<vector<int>> picture){
    queue<pair<intint>> q;
    q.push({y,x});
    isVisited[y][x] = 1;
    int color = picture[y][x]; // 탐색할 색 초기화
    int cnt = 1// 탐색할 색의 개수 초기화
    
    while(!q.empty()){
        y = q.front().first;
        x = q.front().second;
        q.pop();
        
        for(int d=0; d<4; d++){
            int ny = y + dir[d][0];
            int nx = x + dir[d][1];
            
            // BFS 이동 조건들
            if(isVisited[ny][nx]) continue;
            if(!isValid(ny, nx)) continue;
            if(picture[ny][nx] != color) continue;
            
            isVisited[ny][nx] = 1;
            cnt ++;
            q.push({ny, nx});
            
        }
    }
    return cnt;
}
 
 
vector<int> solution(int m, int n, vector<vector<int>> picture) {
    
    // 초기화
    memset(isVisited, 0sizeof(isVisited));
    N = n; M = m;
    int number_of_area = 0;
    int max_size_of_one_area = 0;
    
    for(int i=0; i<m; i++){
        for(int j=0; j<n; j++){
            // 방문했거나 색이 없는 곳은 탐색하지 않는다.
            if(isVisited[i][j]) continue;
            if(picture[i][j] == 0continue;
            
            number_of_area ++// 영역 개수 
            max_size_of_one_area = max(bfs(i, j, picture), max_size_of_one_area); // 최대 넓이 영역 탐색
        }
    }
 
    vector<int> answer(2);
    answer[0= number_of_area;
    answer[1= max_size_of_one_area;
    
    return answer;
}
cs

 

 

 

시행착오

반응형