작성
·
135
0
저는 bfs와 dfs를 혼용하는 방식으로 코드를 짯는데 이렇게 짜면 단점이 어떤게 있을지 궁금합니다.
큰돌님 항상 강의 잘 듣고 있습니다 감사합니다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
int dx[4] = {0, 0, 1, -1};
int dy[4] = { 1, -1, 0, 0 };
int N, M, startX, startY, endX, endY;
char board[300][300] = { 0 };
int visit[300][300] = { 0 };
queue<pair<int, int>> q;
void print() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cout << board[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
}
void print2() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cout << visit[i][j] << " ";
}
cout << "\n";
}
cout << "\n";
}
void dfs(int x, int y, int a) {
//print2();
visit[y][x] = a;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx <0 || nx > M || ny <0 || ny > N)
continue;
if (!visit[ny][nx] && board[ny][nx] == '0') {
dfs(nx, ny, a);
}
else if (!visit[ny][nx] && (board[ny][nx] == '1'|| board[ny][nx] == '#')) {
board[ny][nx] = '0';
visit[ny][nx] = a;
q.push({ nx, ny });
}
}
}
void bfs() {
q.push({ startX-1, startY-1 });
visit[startY-1][startX-1] = 1;
while (!q.empty()) {
//print2();
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx <0 || nx > M || ny <0 || ny > N)
continue;
if (!visit[ny][nx] && board[ny][nx] == '1') {
q.push({ nx, ny });
visit[ny][nx] = visit[y][x] + 1;
board[ny][nx] = '0';
}
else if (!visit[ny][nx] && board[ny][nx] == '0') {
dfs(nx, ny, visit[y][x] + 1);
if (visit[endY-1][endX-1])
return;
}
else if (!visit[ny][nx] && board[ny][nx] == '#') {
visit[ny][nx] = visit[y][x] + 1;
return;
}
}
}
}
int main() {
char symbol;
cin >> N >> M;
cin >> startY >> startX >> endY >> endX;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> symbol;
board[i][j] = symbol;
}
}
bfs();
cout << visit[endY - 1][endX - 1]-1;
}
답변 2
0
안녕하세요 혁수님 ㅎㅎ
잘 짜셨네요. ㅎㅎ
군더더기 없는 코드입니다. BFS + 0일 때의 퍼져나가는 것을 DFS로 구현하신 것도 좋은 생각입니다.
BFS로만 짜면 코드수는 더 감소하지만 지금의 혁수님 코드도 더할나위없는 좋은 코드입니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴입니다.
큰돌님의 코드에서 BFS와 DFS를 혼용하는 방법이 유용할 수 있지만, 몇 가지 단점이 있습니다.
가독성과 유지보수: BFS와 DFS를 함께 사용할 경우, 코드의 복잡도가 증가하여 가독성이 떨어지고 유지보수가 어려워질 수 있습니다. 특히, 큰 프로젝트나 다른 개발자와의 협업에서 코드 이해도를 유지하는 것이 중요합니다.
재귀 호출의 오버헤드: DFS 구현에서 재귀 호출을 사용하는 경우, 특히 깊은 재귀가 발생할 수 있는 상황에서는 스택 오버플로우를 유발하거나 불필요한 오버헤드를 발생시킬 수 있습니다.
성능 문제: BFS와 DFS를 혼합하여 사용할 때, 알고리즘이 방문하지 않은 노드를 찾는 과정에서 불필요한 검사가 반복될 수 있습니다. 이는 특히 경로 탐색이 긴 경우에 성능 저하를 초래할 수 있습니다.
로직의 복잡성: 서로 다른 탐색 전략을 혼합하면, 알고리즘의 로직을 이해하고 디버깅하는 것이 더 어려워질 수 있습니다. 오류를 찾거나 로직을 수정할 때 예상치 못한 부작용이 발생할 가능성이 있습니다.
BFS와 DFS를 효과적으로 혼합하여 사용하는 것은 가능하지만, 알고리즘의 목적과 환경을 고려하여 가장 적합한 접근 방식을 선택하는 것이 중요합니다. 더 나은 성능이나 특정 문제에 대한 해결책을 제공할 경우에만 혼합된 접근 방식을 고려해보세요.