반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Oracle
- Java의정석
- 리액트네이티브
- 이안의평일코딩
- 정보처리기사요약
- 정보처리기사실기
- 정보처리기사정리
- 리액트
- 자스코테
- react
- 정보처리기사실기요약
- javascript
- php
- 스프링
- CSS
- typescript
- spring
- 평일코딩
- 코딩테스트
- 국비코딩
- 타입스크립트
- 정보처리기사
- 오라클
- 자바스크립트
- 국비IT
- ReactNative
- 정보처리기사실기정리
- 자바스크립트 코딩테스트
- 자바의정석
- VUE
Archives
- Today
- Total
이안의 평일코딩
그래프 4) DFS와 BFS의 차이 본문
반응형
그래프를 탐색하는 방법에는 DFS(Depth First Search: 깊이 우선 탐색)과 BFS(Breadth First Search: 넓이 우선 탐색) 두 가지가 있다.
DFS는 루트노드에서 시작해 다음 분기로 넘어가기 전 해당 분기를 완벽하게 탐색하는 방식을 말한다.
BFS는 루트노드에서 시작해 인접한 노드를 먼저 탐색하는 방식으로 시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법이다.
모든 노드를 방문하고자 하는 경우에는 DFS를 가까운 노드부터 탐색하기 위해서는 BFS를 사용한다.
검색 속도 자체는 BFS가 빠르지만 DFS가 더 간단하다.
검색 대상 그래프가 크거나 경로의 특징을 저장해둬야 하는 문제는 DFS를,
검색 대상의 규모가 크지 않고 최단거리를 구해야 하는 문제는 BFS가 유리하다.
DFS는 스택 또는 재귀함수로 구현하고 BFS는 큐를 이용해서 구현한다.
// DFS
function solution(board) {
let answer = 0;
let n = board.length;
let dx = [-1, -1, 0, 1, 1, 1, 0, -1];
let dy = [0, 1, 1, 1, 0, -1, -1, -1];
function DFS(x, y) {
board[x][y] = 0; // 0으로 바꿔준다
for (let k = 0; k < 8; k++) { // 8방향 탐색
let nx = x + dx[k];
let ny = y + dy[k];
if (nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx][ny] === 1) { // 이동한곳이 섬일때
console.log(nx, ny); // 섬일때 탐색
DFS(nx, ny); // 섬일때 재귀탐색
}
}
}
// 2차원 배열 탐색
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (board[i][j] === 1) { // 1이면 섬
answer++;
console.log(i, j); // 시작점
DFS(i, j);
console.log("DFS end");
}
}
}
return answer;
}
// BFS
function solution(board) {
let answer = 0;
let n = board.length;
let dx = [-1, -1, 0, 1, 1, 1, 0, -1];
let dy = [0, 1, 1, 1, 0, -1, -1, -1];
let queue = [];
// 이차원 배열 탐색
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (board[i][j] === 1) { // 1이면 섬
board[i][j] = 0; // 0으로 바꿔줌(back 방지)
queue.push([i, j]); // 출발점
answer++;
while (queue.length) { // queue 배열이 비면 종료
let [x, y] = queue.shift(); // x, y로 할당
console.log(x, y);
for (let k = 0; k < 8; k++) { // 8방향 탐색
let nx = x + dx[k];
let ny = y + dy[k];
if (nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx][ny] === 1) { // 섬일때
board[nx][ny] = 0; // 0으로 바꿔줌
queue.push([nx, ny]); // 섬도착 시 push해서 while문 돌려 다음 섬 탐색
}
}
}
console.log("BFS end");
}
}
}
return answer;
}
반응형
'Study > JS Algorithm Rocket' 카테고리의 다른 글
그래프 3) 인접행렬과 인접리스트의 차이 (0) | 2021.12.01 |
---|---|
그래프 2) 방향 그래프, 무방향 그래프, 가중치 방향그래프 정리 (0) | 2021.12.01 |
그래프 1) binary tree, vertex, node, edge 용어 정리 (0) | 2021.12.01 |
[JS] 재귀함수 알고리즘 (스택프레임) (0) | 2021.11.08 |
[자료구조(스택, 큐)] 크레인 인형뽑기 (카카오 기출) (0) | 2021.10.06 |
Comments