- 문제
- 0은 물, 1은 땅으로 이루어진 그리드에 이어진 땅이 몇개 존재하는가를 리턴
- 즉, 물로 분단되어진 땅이 몇개인지를 찾는 문제
- 시도
- 문제를 이해하는건 쉬웠으나, 개념적으로 접근하기가 어렵다
- 이어진 땅을 확인하는 코드를 작성해야 하는데...
- 첫번째, 분단이 되었는지를 확인해야 하는건, 즉 위에 탐색한 1과 같은 행에 1이 존재하는가
- 0열을 탐색하고 1이 있는 행을 체크
- 1열을 탐색할 때, 0열에 1이 있던 행에 1이 없다면 카운트
- 아 그럼 위의 행에 이어진 1은 하나의 덩어리로 봐야하니까 안되겠네..
- 두번째, 0열을 탐색하고 1이 있는 상하좌우에 1이 하나라도 있는지 체크, 없으면 섬이니 카운팅
- 이렇게 풀려면 덩어리인 섬이 체크가 안되겠네...
- 세번째, 1이 있는 위치를 빈 배열에 저장, 인접해있는 좌표는 같은 인덱스에 묶어서 저장
- 즉, 1이 있는 위치를 찾아서 저장하고, 그와 인접해 있는 위치는 배열 내 배열로 하나로 묶어서 저장
- 그 배열의 길이를 리턴하면 덩어리가 계산되게끔
- DFS를 써야 하는 거였구나...
- 수도 코드
const countIslands = function (grid) {
let sum = [];
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
if (grid[i][j] === '1') {
if (sum.length === 0) {
sum.push([[i,j]]);
} else {
for (let k = 0; k < sum.length; k++) {
for (let l = 0; l < sum[k].length; l++) {
break;
}
}
}
}
}
}
return sum.length;
};
- 레퍼런스
const countIslands = function (grid) {
const HEIGHT = grid.length;
const WIDTH = HEIGHT && grid[0].length;
let count = 0;
for (let row = 0; row < HEIGHT; row++) {
for (let col = 0; col < WIDTH; col++) {
if (grid[row][col] === '0') continue;
count++;
searchIsland(row, col);
}
}
function searchIsland(row, col) {
if (row < 0 || col < 0 || row >= HEIGHT || col >= WIDTH) return;
if (grid[row][col] === '0') return;
grid[row][col] = '0';
searchIsland(row - 1, col);
searchIsland(row + 1, col);
searchIsland(row, col - 1);
searchIsland(row, col + 1);
}
return count;
};