티스토리 뷰
Problem
Given an m x n 2D binary grid grid which represents a map of '1's (land) and '0's (water), return the number of islands.
An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
Input: grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
Output: 1
Example 2:
Input: grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
Output: 3
Constraints:
- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 300
- grid[i][j] is '0' or '1'.
Solution
M * N 행렬이 주어지는데 1이 땅을, 0이 물을 의미합니다. 1로 이어진 부분을 섬이라고 부를 때 모든 섬의 개수를 구하는 문제입니다.
DFS를 이용해 풀 수 있습니다.
public class Solution {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
int m = grid.length;
int n = grid[0].length;
int count = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '1') {
count++;
merge(grid, i, j);
}
}
}
return count;
}
public void merge(char[][] grid, int i, int j) {
int m = grid.length;
int n = grid[0].length;
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] != '1') {
return;
}
grid[i][j] = 'X';
merge(grid, i - 1, j);
merge(grid, i + 1, j);
merge(grid, i, j - 1);
merge(grid, i, j + 1);
}
}
땅을 방문했을 때 방문처리하고 땅 주변을 다시 방문하도록 처리하면서 각각의 상황에서 범위를 벗어나지 않았는지, 물이 아닌지 체크하여 모든 행렬을 탐색하면서 섬의 개수를 카운트 해주면 됩니다.
Test
package io.lcalmsky.leetcode.number_of_islands;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
class SolutionTest {
@Test
public void givenGrid_whenFindIslands_thenCountThemExactly() {
assertAll(
() -> test(new char[][]{
{'1', '1', '1', '1', '0'},
{'1', '1', '0', '1', '0'},
{'1', '1', '0', '0', '0'},
{'0', '0', '0', '0', '0'},
}, 1),
() -> test(new char[][]{
{'1', '1', '0', '0', '0'},
{'1', '1', '0', '0', '0'},
{'0', '0', '1', '0', '0'},
{'0', '0', '0', '1', '1'},
}, 3)
);
}
private void test(char[][] given, int expected) {
// when
Solution numberOfIslands = new Solution();
int actual = numberOfIslands.numIslands(given);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
1448. Count Good Nodes in Binary Tree (0) | 2022.09.02 |
---|---|
869. Reordered Power of 2 (0) | 2022.08.31 |
383. Ransom Note (0) | 2022.08.29 |
326. Power of Three (0) | 2022.08.27 |
342. Power of Four (0) | 2022.08.26 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스프링 부트
- 함께 자라기
- 스프링 부트 회원 가입
- JPA
- 스프링 데이터 jpa
- 스프링 부트 애플리케이션
- Spring Boot JPA
- spring boot application
- Spring Boot
- 클린 아키텍처
- 스프링부트
- spring boot jwt
- 알고리즘
- Spring Data JPA
- Jackson
- gRPC
- Java
- 헥사고날 아키텍처
- proto3
- QueryDSL
- r
- JSON
- @ManyToOne
- 함께 자라기 후기
- intellij
- Spring Boot Tutorial
- Linux
- 스프링 부트 튜토리얼
- leetcode
- spring boot app
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함