시작점에서 한 갈래로 더 이상 갈 수 없을 때까지 탐색하고, 더 갈 곳이 없다면 이전의 경로로 되돌아간다.

void DFS_Graph(int nodeId) { // nodeId: 현재 정점을 표시하는 ID 값
visit(nodeId); // 방문했음 표시
// 연결된 그래프들을 확인
for (Node node : linkedNode(nodeId)) {
if (isVisit(node.getId()) != true) { // 아직 방문하지 않은 경우, 재귀적으로 탐색
DFS_Graph(node.getId());
}
}
}
void DFS_Coordinate(int x, int y) { // 현재 정점의 좌표(x, y)
visit(x, y); // 방문했음을 표시
// 위로 이동
if (isValid(x, y - 1)) {
DFS_Coordinate(x, y - 1);
}
// 아래로 이동
if (isValid(x, y + 1)) {
DFS_Coordinate(x, y + 1);
}
// 왼쪽으로 이동
if (isValid(x - 1, y)) {
DFS_Coordinate(x - 1, y);
}
// 오른쪽으로 이동
if (isValid(x + 1, y)) {
DFS_Coordinate(x + 1, y);
}
}
📌 DFS와 BFS의 메모리 사용량
DFS: 예상치 못한 경우에는 많은 메모리를 사용하지만, 전체적으로는 적게 든다
BFS: 메모리는 효율적으로 쓰지만 기본적으로 메모리 사용량이 많다.
| 그래프 | Queue |
|---|---|
![]() | ![]() |
void BFS_Graph(int startNodeId) {
queue.push(startNodeId); // 먼저 시작점을 큐에 넣는다.
// 큐가 빌 때까지 반복
while(!queue.isEmpty()) {
Long nodeId = queue.pop(); // 큐의 제일 앞에 있는 정점을 뽑는다.
visit(nodeId); // 뽑은 지점와 연결된 정점을 큐에 추가한다.
if (targetId.equals(node.getId())) { // 뽑은 지점이 목표 정점이라면 반복 종료
return;
}
// 연결된 다른 정점들을 순회한다.
for (Node node : linkedNode(nodeId)) {
if (isVisit(node.getId()) != true) {
queue.push(node.getId());
}
}
}
}
Queue에 들어가는 값이 Id가 아닌 (x, y)로 바뀌는 것 빼고는 그래프와 동일하다.
void BFS_Coordinate(int start_x, int start_y) { // 시작 지점(x, y)
queue.push(new Position(start_x, start_y)); // 위치를 하나 뽑는다.
// 큐가 빌 때까지 반복
while(!queue.isEmpty()) {
Position position = queue.pop();
visit(position.x, position.y); // 방문 처리
if (targetPosition.Equals(position)) { // 만약 목적지라면 로직 종료
return;
}
// 위로 이동
if (isValid(position.x, position.y - 1)) {
queue.push(position.x, position.y - 1);
}
// 아래로 이동
if (isValid(position.x, position.y + 1)) {
queue.push(position.x - 1, position.y + 1);
}
// 왼쪽으로 이동
if (isValid(position.x - 1, position.y)) {
queue.push(position.x - 1, position.y);
}
// 오른쪽으로 이동
if (isValid(position.x + 1, position.y)) {
queue.push(position.x + 1, position.y);
}
}
}