주난의 난 질문
200
작성한 질문수 2
저는 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를 효과적으로 혼합하여 사용하는 것은 가능하지만, 알고리즘의 목적과 환경을 고려하여 가장 적합한 접근 방식을 선택하는 것이 중요합니다. 더 나은 성능이나 특정 문제에 대한 해결책을 제공할 경우에만 혼합된 접근 방식을 고려해보세요.
코딩살구클럽 가입이 안됩니다.
0
16
0
살구 클럽에 대한 질문있습ㄴ디ㅏ
0
28
1
교안 158페이지 문의드립니다
0
34
2
코딩살구클럽 관련 건의사항
0
71
1
코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다
0
33
1
진행 방법 질문드립니다!
0
65
2
2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.
0
60
2
2주차 개념#12 트리 순회
0
29
2
백준사이트가 종료된다고 합니다.
0
291
2
백준 서비스 종료
9
904
1
sk 하이닉스 코테 대비
0
373
2
3-G 최댓값 질문
0
52
1
모듈러 연산 값이 10이 아닌 경우도 있지 않나요?
0
84
2
3-I 코드 질문드립니다.
0
63
2
3-N 질문 있습니다.
0
68
2
학습방법
0
103
2
4-H 질문 있습니다 (코드 리뷰)
0
67
2
코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.
0
174
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
70
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
65
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
52
2
조합 재귀 풀이 확인 해주시면 감사하겠습니다.
0
69
2
함수별 시간복잡도
0
75
2
3-h 질문입니다.
0
50
1





