Algorithm/Programmers

[Programmers] 카카오프렌즈 컬러링북

goakgoak 2020. 6. 16. 12:23

[Level 2] 카카오프렌즈 컬러링북

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

  • 그림에 몇 개의 영역이 있는지와 가장 큰 영역의 넓이는 얼마인지 계산하는 프로그램 작성
  • 영역이란 상하좌우로 연결된 같은 색상의 공간을 의미한다.
  • 그림의 원소 중 값이 0인 경우는 색칠하지 않는 영역을 뜻한다.

 

 

Solution

  • picture 전체 배열을 돌면서 0이 아니면서 아직 방문하지 않은 영역(count 하지 않은 영역)에 대해 BFS를 돌린다.
  • BFS()에서는 해당 영역에 해당하는 최대 칸 수를 갱신하고 max 변수에 저장한다. 

 

 

소스코드

 

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
74
75
76
77
import java.util.*;
 
class Solution {
    static int[][] visited, map;
    static int dx[] = {1,-1,0,0};
    static int dy[] = {0,0,1,-1};
    static int max, r, c;
    static Queue<Dot> q;
    
    static class Dot{
        private int x,y;
        public Dot(int x, int y){
        this.x = x;
        this.y = y;
        }
    }   
     public int[] solution(int m, int n, int[][] picture) {
        int numberOfArea = 0;
        int maxSizeOfOneArea = 0;
        int[] answer = new int[2];
        
        init(m,n,picture);
    
         for(int i = 0; i<m; i++){
             for(int j = 0; j<n; j++){
                 if(map[i][j] > 0 && visited[i][j] == 0){
                     bfs(new Dot(i,j), map[i][j]);
                     numberOfArea++;
                 }
             }
         }
        
        answer[0= numberOfArea;
        answer[1= max;
        return answer;
    }
        
    static void bfs(Dot dot, int color){
         int count = 0;
        q = new LinkedList<>();
        q.offer(dot);
        visited[dot.x][dot.y] = 1;
        
        while(!q.isEmpty()){
            count++;
            Dot cur = q.poll();
            
            int nx,ny;
            for(int i = 0; i<4; i++){
                nx = dx[i] + cur.x;
                ny = dy[i] + cur.y;
                
                if(nx >= r || ny >= c || nx < 0 || ny <0)
                    continue;
                
                if(map[nx][ny] != color || visited[nx][ny] == 1)
                    continue;
                
                q.offer(new Dot(nx,ny));
                visited[nx][ny] = 1;
            }
        }
        max = Math.max(max,count);
    }
        
    static void init(int m, int n, int[][] arr){
        r = m;
        c = n;
        max = Integer.MIN_VALUE;
        map = new int[r][c];
        visited = new int[r][c];
        
        for(int i = 0; i<r; i++){
            map[i] = arr[i].clone();
        }
    }
}
cs