-
문제설명
N*N의 섬나라 아일랜드의 지도가 격자판의 정보로 주어집니다. 각 섬은 1로 표시되어 상하좌 우와 대각선으로 연결되어 있으며, 0은 바다입니다. 섬나라 아일랜드에 몇 개의 섬이 있는지 구하는 프로그램을 작성하세요.
입력설명
첫 번째 줄에 자연수 N(3<=N<=20)이 주어집니다. 두 번째 줄부터 격자판 정보가 주어진다.
출력설명
첫 번째 줄에 섬의 개수를 출력한다.
입력예제
1 1 0 0 0 1 0
0 1 1 0 1 1 0
0 1 0 0 0 0 0
0 0 0 1 0 1 1
1 1 0 1 1 0 0
1 0 0 0 1 0 0
1 0 1 0 1 0 0
출력예제
5
풀이1) DFS
function solution(n, ocean) { let answer = 0; const dx = [0, 1, 1, 1, 0, -1, -1, -1]; const dy = [-1, -1, 0, 1, 1, 1, 0, -1]; const check = ocean.map((v) => [...v]); function DFS(x, y) { for (let k = 0; k < 8; k++) { let nx = x + dx[k]; let ny = y + dy[k]; if (nx >= 0 && ny >= 0 && nx < n && ny < 7 && check[nx][ny] === 1) { check[nx][ny] = 0; DFS(nx, ny); } } } for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { if (check[i][j] === 1) { DFS(i, j); check[i][j] = 0; answer++; } } } return answer; }
풀이2) BFS
function solution(n, ocean) { let answer = 0; const dx = [0, 1, 1, 1, 0, -1, -1, -1]; const dy = [-1, -1, 0, 1, 1, 1, 0, -1]; const check = ocean.map((v) => [...v]); let queue = []; for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { if (check[i][j] === 1) { answer++; check[i][j] = 0; queue.push([i, j]); while (queue.length) { let [x, y] = queue.shift(); for (let k = 0; k < 8; k++) { let nx = x + dx[k]; let ny = y + dy[k]; if (nx >= 0 && ny >= 0 && nx < n && ny < n && check[nx][ny] === 1) { check[nx][ny] = 0; queue.push([nx, ny]); } } } } } } return answer; }
'Algorithm' 카테고리의 다른 글
동전교환 (냅색알고리즘) (0) 2022.07.06 최대부분증가수열 (0) 2022.07.06 송아지 찾기(BFS) (0) 2022.07.05 미로탐색 (DFS) (0) 2022.07.05 조합의 경우수(Memoization) (0) 2022.06.28