카테고리 없음

프로그래머스 - (Java) 카카오프렌즈

dev.moon 2021. 6. 5. 10:25

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

1. 유형

BFS

2. 풀이

  • 이중for문 탐색으로 1이상의 값만 bfs함수 적용
  • bfs에서 같은 색의 칸으로만 이동가능

3. 코드

import java.util.*;
class Solution {
    static boolean visited[][];
    static int[][] dir={{-1,0}, {0,1}, {1,0}, {0,-1}};
    static int M,N,maxarea;
    static void bfs(int r, int c, int type, int picture[][]){
        Queue<int[]> q = new LinkedList<>();
        visited[r][c] = true;
        q.add(new int[]{r, c});
        int area=0;
        while(!q.isEmpty()){
            int cur[]  = q.poll();
            ++area;
            for(int k=0; k<4; k++){
                int nr = cur[0]+dir[k][0];
                int nc = cur[1]+dir[k][1];
                if(boundary(nr,nc) || picture[nr][nc]!=type || visited[nr][nc]) continue;
                visited[nr][nc]=true;
                q.add(new int[]{nr,nc});
            }
        }
        maxarea=Math.max(maxarea, area);
    }
    static void init(int m, int n){
        visited = new boolean[m][n];
        M=m;
        N=n;
        maxarea=0;
    }

    static boolean boundary(int nr, int nc){
        if(nr<0 || nr>=M || nc<0 || nc>=N)
            return true;
        return false;
    }

    public int[] solution(int m, int n, int[][] picture) {
        init(m,n);
        int cnt = 0;
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(!visited[i][j] && picture[i][j]>0){
                    ++cnt;
                    bfs(i, j, picture[i][j], picture);
                }
            }
        }
        int[] answer={cnt, maxarea};
        return answer;
    }
}
/*
로직
- bfs
- for range(N):
    for rnage(M):
        if not visited and picture>=1
            answer++
            bfs

bfs(r,c):
    max(area, maxarea)
*/