[Programmers]-카카오프렌즈 컬러링북
이번 프로그래머스 문제는 카카오프렌즈 컬러링북 입니다.
문제 풀이
dfs와 bfs 알고리즘으로 쉽게풉니다.
이 알고리즘이 많이 지워진 상태여서 공부 후 포스팅해볼 예정이다.
공부는 했지만 정리가 안됐다.
**문제풀이 **
- dfs를 이용한 재귀함수
주석에 상세하게 적어 놓았다. 코드가 길지만 어렵지 않다.
class Solution {
int count;
boolean[][] visited;
int[] dirX = {1, 0, -1, 0};//우,하,좌,상
int[] dirY = {0, 1, 0, -1};
public int[] solution(int m, int n, int[][] picture) {
int numberOfArea = 0;//나눠진 영역 수
int maxSizeOfOneArea = 0;//영역중 가장 큰 범위
int[][] draw = new int[m+2][n+2];//복제할 배열
visited = new boolean[m+2][n+2];//방문 여부 배열
for(int i=0;i<m;i++){//clone
for(int j=0;j<n;j++){
draw[i+1][j+1] = picture[i][j];
}
}
for(int i=1;i<m+1;i++){
for(int j=1;j<n+1;j++){
if(draw[i][j]!=0&&!visited[i][j]){//색칠되어있고 방문하지 않았을 경우
count = 1;//draw[i][j]를 포함해야해서 1초기화
dfs(i, j, draw);
//재귀를 다 마치면 재귀한 만큼 count가 쌓임
if(maxSizeOfOneArea<count) maxSizeOfOneArea = count;//최대치
numberOfArea++;//한 영역(사이클) 돌면서 영역 추가
}
}
}
int[] answer = new int[2];
answer[0] = numberOfArea;
answer[1] = maxSizeOfOneArea;
return answer;
}
public void dfs(int x, int y, int[][] draw){
visited[x][y] = true;//방문했음
for(int i=0;i<4;i++){
int xx = x + dirX[i];//비교 x
int yy = y + dirY[i];//비교 y
if(draw[x][y]==draw[xx][yy] && !visited[xx][yy]){//같거나 방문안했을경우 재귀
count++;
dfs(xx,yy,draw);
}
}
}
}
dfs/bfs알고리즘은 졸업작품을 끝마치고 포스팅해볼 예정이다.
dfs로 풀어보았으니 bfs로도 풀어서 포스팅할 예정