https://programmers.co.kr/learn/courses/30/lessons/1829
// 기본 dfs,bfs 문제에서 기준값에 해당하는 것들만 방문하기로 조건이 추가된 것
//테스트코드
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class KakaoFriendsColoringBookTest {
KakaoFriendsColoringBook q;
@BeforeEach
void beforeEach() {
q = new KakaoFriendsColoringBook();
}
@Test
void test1() {
assertArrayEquals(new int[]{4, 5}, q.solution(6, 4, new int[][]{{1, 1, 1, 0}, {1, 2, 2, 0}, {1, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 3}, {0, 0, 0, 3}}));
}
}
//프로덕션코드
public class KakaoFriendsColoringBook {
int numberOfArea = 0;
int maxSizeOfOneArea = 0;
int sizeOfOneArea = 0;
boolean[][] visited;
int[] dx = {1, -1, 0, 0};
int[] dy = {0, 0, -1, 1};
public int[] solution(int m, int n, int[][] picture) {
visited = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (picture[i][j] != 0 && visited[i][j] == false) {
dfs(i, j, picture, m, n, picture[i][j]);
numberOfArea++;
maxSizeOfOneArea = Math.max(maxSizeOfOneArea, sizeOfOneArea);
sizeOfOneArea = 0;
}
}
}
return new int[]{numberOfArea, maxSizeOfOneArea};
}
void dfs(int i, int j, int[][] picture, int m, int n, int pivotnumber) {
if (i < 0 || m <= i || j < 0 || n <= j) {
return;
}
if (visited[i][j]) {
return;
}
if (picture[i][j] != pivotnumber) {
return;
}
visited[i][j] = true;
sizeOfOneArea++;
for (int k = 0; k < 4; k++) {
dfs(i + dx[k], j + dy[k], picture, m, n, pivotnumber);
}
}
}
// 성공! 리팩토링하자.
public class KakaoFriendsColoringBook {
int numberOfArea = 0;
int maxSizeOfOneArea = 0;
int sizeOfOneArea = 0;
boolean[][] visited;
int[] dx = {1, -1, 0, 0};
int[] dy = {0, 0, -1, 1};
public int[] solution(int m, int n, int[][] picture) {
visited = new boolean[m][n];
checkAllpoints(m, n, picture);
return new int[]{numberOfArea, maxSizeOfOneArea};
}
private void checkAllpoints(int m, int n, int[][] picture) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
checkAPoint(m, n, picture, i, j);
}
}
}
private void checkAPoint(int m, int n, int[][] picture, int i, int j) {
if (picture[i][j] != 0 && visited[i][j] == false) {
dfs(i, j, picture, m, n, picture[i][j]);
numberOfArea++;
maxSizeOfOneArea = Math.max(maxSizeOfOneArea, sizeOfOneArea);
sizeOfOneArea = 0;
}
}
void dfs(int i, int j, int[][] picture, int m, int n, int pivotnumber) {
if (i < 0 || m <= i || j < 0 || n <= j) {
return;
}
if (visited[i][j]) {
return;
}
if (picture[i][j] != pivotnumber) {
return;
}
visited[i][j] = true;
sizeOfOneArea++;
for (int k = 0; k < 4; k++) {
dfs(i + dx[k], j + dy[k], picture, m, n, pivotnumber);
}
}
}
// 굿!
// 다 좋긴한데 매개변수를 좀 더 깔끔하게 처리할 수 있는 방법이 없을까?...
// 그리고 전형적인 문제인데 구현하는데 생각보다 시간이 오래걸렸다. dfs, bfs 코드 다시 확인해보고 연습하자.
'코딩테스트연습 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 - JAVA] 프린터 (0) | 2021.12.20 |
---|---|
[프로그래머스 - JAVA] 기능개발 (0) | 2021.12.18 |
[프로그래머스 - JAVA] 문자열 내 마음대로 정렬하기 (0) | 2021.12.16 |
[프로그래머스 - JAVA] 크레인 인형뽑기 게임 (0) | 2021.12.14 |
[프로그래머스 - JAVA] 같은 숫자는 싫어 (1) | 2021.12.13 |