[문제 설명]
출판사의 편집자인 어피치는 네오에게 컬러링북에 들어갈 원화를 그려달라고 부탁하여 여러 장의 그림을 받았다. 여러 장의 그림을 난이도 순으로 컬러링북에 넣고 싶었던 어피치는 영역이 많으면 색칠하기가 까다로워 어려워진다는 사실을 발견하고 그림의 난이도를 영역의 수로 정의하였다. (영역이란 상하좌우로 연결된 같은 색상의 공간을 의미한다.)
그림에 몇 개의 영역이 있는지와 가장 큰 영역의 넓이는 얼마인지 계산하는 프로그램을 작성해보자.
[제한 사항]
- 1 <= m, n <= 100
- picture의 원소는 0 이상 2^31 - 1 이하의 임의의 값이다.
- picture의 원소 중 값이 0인 경우는 색칠하지 않는 영역을 뜻한다.
[풀이]
카카오 문제 치고는 쉬운편이라고 생각합니다. 전형적인 BFS/DFS 문제이고 둘 중에 무엇을 사용하더라도 상관없습니다. 총 구해야 할 값은 두 가지 입니다. 하나는 전체가 각각 몇개의 영역으로 구성되어 있는지 입니다. 해당 값은 이중 for문으로 전체 이중 배열을 하나하나 돌리면서 특정 값이 0이외의 숫자이고 지금까지 나오지 않은 특정 숫자라면 하나씩 늘려줍니다.
두 번째 값은 BFS/DFS를 통해 구해야 합니다. BFS/DFS 내에서 위,아래,왼쪽,오른쪽을 이동하면서 똑같은 숫자라면 호출해 줍니다. 호출할때 마다 문제의 값을 구하기 위해 1씩 증가시키는 것을 잊으면 안됩니다.
class Solution {
static int[] d1 = { -1, 1, 0, 0 };
static int[] d2 = { 0, 0, -1, 1 };
static boolean[][] visit;
static int count = 1;
public int[] solution(int m, int n, int[][] picture) {
int[] answer = new int[2];
visit = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (picture[i][j] != 0 && visit[i][j] == false) {
answer[0]++;
DFS(i, j, m, n, picture);
answer[1] = Math.max(answer[1], count);
count = 1;
}
}
}
return answer;
}
private static void DFS(int px, int py, int m, int n, int[][] picture) {
// TODO Auto-generated method stub
visit[px][py] = true;
for (int i = 0; i < 4; i++) {
int xx = px + d1[i];
int yy = py + d2[i];
if (xx >= 0 && xx < m && yy >= 0 && yy < n) {
if (visit[xx][yy] == false && picture[xx][yy] == picture[px][py]) {
count++;
DFS(xx, yy, m, n, picture);
}
}
}
}
}
'알고리즘 > 프로그래머스_LEVEL_2' 카테고리의 다른 글
[프로그래머스] 메뉴 리뉴얼 (2021 KAKAO BLIND RECRUITMENT)-JAVA (0) | 2022.05.29 |
---|---|
[프로그래머스] 짝지어 제거하기 (2017 팁스타운)-JAVA (0) | 2022.05.27 |
[프로그래머스] 더 맵게 (Heap)-JAVA (0) | 2022.05.25 |
[프로그래머스] 기능개발 (스택/큐)-JAVA (0) | 2022.05.25 |
[프로그래머스] 문자열 압축 (2020 KAKAO BLIND RECRUITMENT)-JAVA (0) | 2022.05.20 |