알고리즘/DFS & BFS
프로그래머스[Level2] - 카카오프렌즈 컬러링북 [2017 카카오코드 예선]
또또쪼
2020. 4. 4. 19:30
728x90
300x250
https://programmers.co.kr/learn/courses/30/lessons/1829?language=java#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
0이아닌 이어진 영역들의 갯수와 영역들 중에서 가장 큰 영역을 return하는 문제.
테케를 다 맞게 잘 짰지만 자꾸 실패가 떠서 찾아보던도중
프로그래머스에서는 전역변수를 지역변수에서 초기화 하지않으면 자꾸 실패가 뜬다고한다.,
그래서 굳이 한번씩 더 값을 넣어주거나 초기화 해주는 작업들을 수행했다.
0이 아니면서 처음방문하는 부분을 영역의 첫 start로 봤다. 그리고 이어진 부분들을 전부 count.
테케가 적어서 몇개 더 추가했다.
13, 16, [[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0], [0, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0], [0, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 0], [0, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 0], [0, 0, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]]
답:[12,120]
import java.util.*;
class Solution {
public static int numberOfArea = 0;
public static int N=0,M=0,maxSizeOfOneArea = 0;
public static int cnt = 0;
public static boolean[][] visit;
public static int[][] map;
public static int[] dx = {0,1,0,-1};
public static int[] dy = {1,0,-1,0};
public int[] solution(int m, int n, int[][] picture) {
numberOfArea = 0;
maxSizeOfOneArea =0;
visit = new boolean[m][n];
map = picture;
N = n;
M = m;
for(int i = 0; i< picture.length; i++) {
for(int j = 0; j<picture[0].length; j++) {
cnt=0;
if(picture[i][j]!=0 && !visit[i][j]) {
visit[i][j]=true;
dfs(i,j,picture[i][j]);
numberOfArea++;
}
}
}
int[] answer = new int[2];
answer[0] = numberOfArea;//area.size();
answer[1] = maxSizeOfOneArea;
return answer;
}
public static void dfs(int row,int col, int num) {
cnt++;
for(int i =0;i<4;i++) {
int nx = row + dx[i];
int ny = col + dy[i];
//범위를 벗어나는가?
if(nx >= M || nx < 0 || ny >= N || ny < 0)
continue;
//내가 찾는 영역이 아닌가?
if(map[nx][ny]!=num)
continue;
//이미 들렸던 곳인가?
if(visit[nx][ny])
continue;
visit[nx][ny]=true;
dfs(nx,ny,num);
}
maxSizeOfOneArea = Math.max(maxSizeOfOneArea,cnt);
}
}
728x90