문제설명
출판사의 편집자인 어피치는 네오에게 컬러링북에 들어갈 원화를 그려달라고 부탁하여 여러 장의 그림을 받았다. 여러 장의 그림을 난이도 순으로 컬러링북에 넣고 싶었던 어피치는 영역이 많으면 색칠하기가 까다로워 어려워진다는 사실을 발견하고 그림의 난이도를 영역의 수로 정의하였다. (영역이란 상하좌우로 연결된 같은 색상의 공간을 의미한다.)
그림에 몇 개의 영역이 있는지와 가장 큰 영역의 넓이는 얼마인지 계산하는 프로그램을 작성해보자.
위의 그림은 총 12개 영역으로 이루어져 있으며, 가장 넓은 영역은 어피치의 얼굴면으로 넓이는 120이다.
해결 방법
DFS와 BFS를 이용했다.
인접한 인덱스를 계속해서 방문해 영역의 수를 구하고, 각 영역의 크기 중 최댓값을 저장한다.
아직 잘 이해가 안되는 부분이 있다면, 전역변수를 메소드 안에서 초기화하지 않아서 에러가 났었다.
아직도 이해가 잘 안간다.
JAVA
package programmers;
import java.util.*;
public class p_1829 {
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
static int[][] visit;
static int max;
static int depth;
public static void dfs(int x, int y, int m, int n, int[][] map, int color) {
depth++;
visit[x][y] = 1;
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && ny >= 0 && nx < m && ny < n && color == map[nx][ny] && visit[nx][ny] == 0)
dfs(nx, ny, m, n, map, color);
}
}
public static void bfs(int x, int y, int m, int n, int color, int[][] map) {
Queue<int[]> q = new LinkedList<>();
int[] node = {x, y};
q.add(node);
visit[x][y] = 1;
int cnt = 0;
while(!q.isEmpty()) {
int[] cur = q.poll();
cnt++;
for(int i = 0; i < 4; i++) {
int nx = cur[0] + dx[i];
int ny = cur[1] + dy[i];
if(nx >= 0 && ny >= 0 && nx < m && ny < n && map[nx][ny] == color && visit[nx][ny] == 0) {
int[] next = {nx, ny};
q.add(next);
visit[nx][ny] = 1;
}
}
}
max = Math.max(cnt, max);
}
public static int[] solution(int m, int n, int[][] map) {
int[] r = new int[2];
visit = new int[m][n];
max = 0;
depth = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(map[i][j] > 0 && visit[i][j] == 0) {
// depth = 0;
r[0]++;
// dfs(i, j, m, n, map, map[i][j]);
bfs(i, j, m, n, map[i][j], map);
max = Math.max(depth, max);
}
}
}
r[1] = max;
return r;
}
public static void main(String[] args) {
// int m = 6;
// int n = 4;
// int[][] map = {{1, 1, 1, 0},
// {1, 2, 2, 0},
// {1, 0, 0, 1},
// {0, 0, 0, 1},
// {0, 0, 0, 3},
// {0, 0, 0, 3}};
int m = 13;
int n = 16;
int[][] map = {{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}};
int[] r = solution(m, n, map);
for(int tmp : r) System.out.println(tmp);
}
}
'Problem Solving > Programmers' 카테고리의 다른 글
[프로그래머스] 영어 끝말잇기 (0) | 2020.04.02 |
---|---|
[프로그래머스] JadenCase 문자열만들기 (0) | 2020.04.02 |
[프로그래머스] 기능개발 (0) | 2020.04.02 |
[프로그래머스] 스킬트리 (0) | 2020.04.02 |
[프로그래머스] 땅따먹기 (0) | 2020.04.02 |
댓글