인프런 커뮤니티 질문&답변

신혁수님의 프로필 이미지
신혁수

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-J

주난의 난 질문

작성

·

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를 혼용하는 방법이 유용할 수 있지만, 몇 가지 단점이 있습니다.

  1. 가독성과 유지보수: BFS와 DFS를 함께 사용할 경우, 코드의 복잡도가 증가하여 가독성이 떨어지고 유지보수가 어려워질 수 있습니다. 특히, 큰 프로젝트나 다른 개발자와의 협업에서 코드 이해도를 유지하는 것이 중요합니다.

  2. 재귀 호출의 오버헤드: DFS 구현에서 재귀 호출을 사용하는 경우, 특히 깊은 재귀가 발생할 수 있는 상황에서는 스택 오버플로우를 유발하거나 불필요한 오버헤드를 발생시킬 수 있습니다.

  3. 성능 문제: BFS와 DFS를 혼합하여 사용할 때, 알고리즘이 방문하지 않은 노드를 찾는 과정에서 불필요한 검사가 반복될 수 있습니다. 이는 특히 경로 탐색이 긴 경우에 성능 저하를 초래할 수 있습니다.

  4. 로직의 복잡성: 서로 다른 탐색 전략을 혼합하면, 알고리즘의 로직을 이해하고 디버깅하는 것이 더 어려워질 수 있습니다. 오류를 찾거나 로직을 수정할 때 예상치 못한 부작용이 발생할 가능성이 있습니다.

BFS와 DFS를 효과적으로 혼합하여 사용하는 것은 가능하지만, 알고리즘의 목적과 환경을 고려하여 가장 적합한 접근 방식을 선택하는 것이 중요합니다. 더 나은 성능이나 특정 문제에 대한 해결책을 제공할 경우에만 혼합된 접근 방식을 고려해보세요.

신혁수님의 프로필 이미지
신혁수

작성한 질문수

질문하기