
https://leetcode.com/problems/number-of-islands/description/
m x n 2์ฐจ์ binary grid๊ฐ ์ฃผ์ด์ก์ ๋, ์ฌ๋ค์ ์๋ฅผ ๋ฆฌํดํ๋ผ.(grid์ '1'์ land๋ฅผ, '0'์ ๋ฌผ์ ์๋ฏธํ๋ค.)
๐ง์ ์ฝ ์กฐ๊ฑด
1. m == grid.length (row), n == grid[i].length (col)
2. 1 <= m, n <= 300
3. grid[i][j]๋ '0' ๋๋ '1'์ด๋ค.
์ ๋ฌธ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก bfs ๋๋ dfs๋ก ํ ์ ์๋ค.
โฐ์ฐธ๊ณ ๋ก, grid์ ๋ชจ๋ ์์๋ฅผ ํ์ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋๋ bfs, dfs ๋๋ค ์ด๋ค.
์๋ณธ grid ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ฒ ํ๊ธฐ ์ํด boolean ํ์ ์ 2์ฐจ์ ๋ฐฐ์ด visited๋ก grid์ ํฌ๊ธฐ๋งํผ ์ค์ ํ์๊ณ ์ฌ๋ค์ ์๋ฅผ ์นด์ดํธ ํ๊ธฐ ์ํด island๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ์๋ค.
๐ค์์์ ๊ทธ๋ํ๋ก ์ฃผ์ด์ง grid๋ฅผ bfs์์ ์ํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ์ง? ์ฆ, HashMap ํ์
์ ์ธ์ ๋ฆฌ์คํธ๊ฐ ์๋ ๋, for๋ฌธ์ ์ด๋ป๊ฒ ์ฌ์ฉํ์ง?
๐จintํ์
์ dr, dc๋ก ์, ํ, ์ข, ์ฐ๋ฅผ ์ค์ ํ ํ, for๋ฌธ์ผ๋ก ์ํ์ํค๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ bfs ํจ์ ํ ํ๋ฆฟ์ ๋์ผํ๊ฒ ์ฌ์ฉํ์๋ค.
public class IslandsSolution {
public int numIslands(char[][] grid) {
int m = grid.length;
int n = grid[0].length;
boolean[][] visited = new boolean[m][n];
int island = 0;
// dr, dc ์ธํ
int[] dr = {-1, 1, 0, 0};
int[] dc = {0, 0, -1, 1};
// ์์ ํ์
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// ์ฌ์ด๊ณ ํ์ฌ ๋ฐฉ๋ฌธ์ ํ์ง ์์์ผ๋ฉด
if (grid[i][j] == '1' && !visited[i][j]) {
// bfs ํ์ ์์ and ์ฌ์ ์ธํ
Queue<Pair> q = new LinkedList<>();
q.offer(new Pair(i, j));
visited[i][j] = true;
while (!q.isEmpty()) {
Pair cur = q.poll();
int startR = cur.r;
int startC = cur.c;
for (int k = 0; k < 4; k++) {
int nextR = startR + dr[k];
int nextC = startC + dc[k];
if ((0 <= nextR && nextR < m) && (0 <= nextC && nextC < n)) {
if (!visited[nextR][nextC] && grid[nextR][nextC] == '1') {
visited[nextR][nextC] = true;
q.offer(new Pair(nextR, nextC));
}
}
}
}
island++;
}
}
}
return island;
}
private static class Pair {
int r;
int c;
public Pair(int r, int c) {
this.r = r;
this.c = c;
}
}
}
ํ์ด์ฌ๊ณผ ๋ค๋ฅด๊ฒ bfs ํจ์๋ฅผ ์บก์ํํ๋๋ฐ dr, dc๋ฅผ ํด๋์ค ๋ ๋ฒจ๋ก ์ ์ธํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ฒ๋ฆฌ๊ฐ ๊น๋ค๋กญ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ๋ฉ์๋ ์์ ํ์ํ ๋ก์ง๋ค์ ์ ๋ถ ๋ฃ์๋ค.
๐์คํ ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค:
1. bfs์์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ฐฉํ๊ธฐ ์ํด dr, dc๋ฅผ ์ค์ ํ์๋ค.
2. 2์ค for๋ฌธ์ผ๋ก grid๋ฅผ ์์ ํ์ํ ๋ grid๊ฐ '1'์ด๊ณ ํ์ฌ ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด bfs ํ์์ ์์ํ๋ค.
3. ํ์ฌ ์ขํ๋ฅผ bfs ํจ์ ํ
ํ๋ฆฟ์์ ์ฌ์ ์ธํ
์ ํ ๋นํ์๊ณ , ์ด๋ ํ์ฌ ์ขํ๋ฅผ queue์ ์ถ๊ฐํ๊ธฐ ์ํด ์ปค์คํ
ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค์๋ค.
4. for๋ฌธ์ผ๋ก dr, dc์ ํฌ๊ธฐ๋งํผ ์ํํ๋๋ฐ, grid์ ๋ฒ์ ๋ด์ ์๊ณ grid๊ฐ '1'์ด๋ฉฐ ํ์ฌ ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ํ๊ณ ํ์ ์ถ๊ฐ๋ฅผ ํ๋ค.
5. ํ๊ฐ ๋น์์ผ๋ฉด bfs๊ฐ ๋๋๊ฑฐ๋๊น island๋ฅผ 1๋งํผ ์ฆ๊ฐ์ํจ๋ค.
6. ์์ ํ์์ ๋๋ด๋ฉด island๋ฅผ ๋ฆฌํดํ๋ค.
dfs ํจ์ ํ ํ๋ฆฟ์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ , bfs์ ์์์ ๊ทธ๋ํ ํ์ฉ๋ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ค๊ณ๋ ํ์ง ์์๋ค.
public class IslandsSolution {
public int numIslands(char[][] grid) {
int m = grid.length;
int n = grid[0].length;
boolean[][] visited = new boolean[m][n];
int island = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '1' && !visited[i][j]) {
island += dfs(grid, visited, i, j, m, n);
}
}
}
return island;
}
private int dfs(char[][] grid, boolean[][] visited, int startR, int startC, int m, int n) {
int[] dr = {1, -1, 0, 0};
int[] dc = {0, 0, -1, 1};
visited[startR][startC] = true;
for (int k = 0; k < 4; k++) {
int nextR = startR + dr[k];
int nextC = startC + dc[k];
if ((0 <= nextR) && (nextR < m) && (0 <= nextC) && (nextC < n) && grid[nextR][nextC] == '1' && !visited[nextR][nextC]) {
dfs(grid, visited, nextR, nextC, m, n);
}
}
return 1;
}
}
๐bfs๋ ํ์ ์ขํ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์ปค์คํ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ง๋ง, dfs๋ ํจ์ ๋ถ๋ถ์ ์ขํ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ทธ๋๋ก ์ ๋ฌ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ปค์คํ ํด๋์ค๋ฅผ ๋ง๋ค ํ์๊ฐ ์์๋ค๋ ์ฐจ์ด์ ์ ๊นจ๋ฌ์๋ค.