Leetcode Java Regions Cut By Slashes
업데이트:
문제
코드
class Solution {
public int regionsBySlashes(String[] grid) {
int length = grid.length;
int size = length * 3;
int regions = 0;
int[][] dp = new int[size][size];
for (int i = 0; i < length; i++) {
int row = i * 3;
for (int j = 0; j < length; j++) {
int col = j * 3;
if (grid[i].charAt(j) == '/') {
dp[row][col + 2] = dp[row + 1][col + 1] = dp[row + 2][col] = 1;
} else if (grid[i].charAt(j) == '\\') {
dp[row][col] = dp[row + 1][col + 1] = dp[row + 2][col + 2] = 1;
}
}
}
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
regions += this.dfs(dp, i, j) > 0 ? 1 : 0;
}
}
return regions;
}
private int dfs(int[][] dp, int i, int j) {
if (Math.min(i, j) < 0 || dp.length <= Math.max(i, j) || dp[i][j] != 0) {
return 0;
} else {
dp[i][j] = 1;
return 1 + this.dfs(dp, i - 1, j) + this.dfs(dp, i, j - 1) + this.dfs(dp, i + 1, j) + this.dfs(dp, i, j + 1);
}
}
}
결과
설명
-
grid는 정사각형의 값을 저장한 변수로, ‘/’과 ‘' 문자열을 이용하여 분리된 사각형 내 영역의 수를 구하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- length는 gird의 길이를 저장한 변수이다.
- size는 영역을 계산하기 위한 dp의 크기를 저장할 변수로, $length \times 3$ 크기로 초기화한다.
- regions는 결과인 영역의 수를 계산하기 위한 변수로, 0으로 초기화한다.
- dp는 regions를 계산하기 위해 구성할 배열로, $size \times size$ 크기의 2차원 정수 배열로 초기화한다.
- 0부터 length 미만까지 i를 증가시키면서 아래를 수행한다.
- dp 내 행의 시작 위치인 row에 $i \times 3$를 넣어준다.
- 0부터 length 미만까지 j를 증가시키면서 아래를 수행한다.
- dp 내 열의 시작 위치인 col에 $j \times 3$를 넣어준다.
- grid의 i번째 행의 j번째 문자가 ‘/’인 경우, $3 \times 3$크기의 영역 내 좌측 하단부터 우측 상단까지 1을 넣어 구분 선을 그어준다.
- 위가 아니면서 해당 문자가 ‘'인 경우, $3 \times 3$크기의 영역 내 좌측 상단부터 우측 하단까지 1을 넣어 구분 선을 그어준다.
-
반복이 완료되면 0부터 size까지 i를 증가시키고, 0부터 size까지 j를 증가시키며 regions에 5번에서 정의한 dfs(int[][] dp, int i, int j) 메서드의 수행 결과가 0 초과이면 1 아니면 0을 넣어준다.
- DFS 방식으로 사각형 내 영역 구분이 이루어지는지 검증하기 위한 dfs(int[][] dp, int i, int j) 메서드를 정의한다.
- i와 j 중 작은 값이 0 미만 혹은 dp의 길이 이상으로 사각형의 범위를 벗어나거나 dp[i][j]의 값이 0이 아닌 값의 경우, 0을 반환한다.
- 위의 경우가 아니라면 dp[i][j]에 1을 넣어주고, 1에 아래의 재귀 호출 결과를 모두 더해 반환한다.
- $i - 1$과 j를 이용하여 좌측 위치에서 재귀 호출.
- i와 $j - 1$을 이용하여 하단 위치에서 재귀 호출.
- $i + 1$과 j를 이용하여 우측 위치에서 재귀 호출.
- i와 $j + 1$를 이용하여 상단 위치에서 재귀 호출.
- 모든 반복이 완료되면 영역이 계산된 regions를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기