백준/탐색

[백준] C++ 2589번(보물섬)

2zreal 2024. 7. 4. 02:20

 

#include <iostream>
#include <queue>

using namespace std;

int arr[51][51];

int BFS(int i, int j);

int row=0;
int col=0;

int visited[51][51];

int main(void)
{

	cin>>row>>col;
	
	for(int i=0; i<row; i++)
	{
		for(int j=0; j<col; j++)
		{
			char c1;
			cin>>c1;
			if(c1=='L')
			{
				arr[i][j]=1;
			}
			else
			{
				arr[i][j]=0;
			}
		}
	}
	int max=0;
	
	for(int i=0; i<row; i++)
	{
		for(int j=0; j<col; j++)
		{
			if(arr[i][j]==1)
			{
				int temp=BFS(i,j);
				if(max<temp)
				{
					max=temp;

				}
				for(int m=0; m<row; m++)
				{
					for(int l=0; l<col; l++)
					{
						visited[m][l]=0;
					}
				}
				
			}
			
		}
	}

	cout<<max<<endl;
	
	return 0;
}

int BFS(int i, int j)
{
	queue<pair<int,int>> Q;
	queue<int> Q2;
	int result=0;
	
	Q.push(make_pair(i,j));
	Q2.push(0);
	
	visited[i][j]=1;
	
	while(!Q.empty())
	{
		int num1=Q.front().first;
		int num2=Q.front().second;
		int count=Q2.front();
		result=count;
		Q.pop();
		Q2.pop();
		
		if(arr[num1+1][num2]==1 && visited[num1+1][num2]==0 && num1+1<row)
		{
			Q.push(make_pair(num1+1,num2));
			Q2.push(count+1);
			visited[num1+1][num2]=1;
		}
		if(arr[num1-1][num2]==1 && visited[num1-1][num2]==0 && num1-1>-1)
		{
			Q.push(make_pair(num1-1,num2));
			Q2.push(count+1);
			visited[num1-1][num2]=1;
		}
		if(arr[num1][num2+1]==1 && visited[num1][num2+1]==0 && num2+1<col)
		{
			Q.push(make_pair(num1,num2+1));
			Q2.push(count+1);
			visited[num1][num2+1]=1;
		}
		if(arr[num1][num2-1]==1 && visited[num1][num2-1]==0 && num2-1>-1)
		{
			Q.push(make_pair(num1,num2-1));
			Q2.push(count+1);
			visited[num1][num2-1]=1;
		}
		
	}
	
	return result;
}

 

이 문제는 보물의 거리를 구하는 문제이다. 보물은 서로 간에 최단 거리로 이동하는데 있어 가장 긴 시간이 걸리는 육지 두 곳에 나뉘어 묻혀있다. 

 

 

나는 너비 우선 탐색을 기반으로 육지인 곳을 모두 탐색하여 해결하였다. (for 문을 돌면서 L인 곳에서 BFS를 실행, W인 곳에서는 BFS를 실행하지 않는다) (BFS에서는 한 칸 지날 때 마다 count++를 하고 최댓값을 찾아내면 된다. 위 그림은 8이 최댓값이다.)

 

알아보니까 queue<<int>,pair<int,int>> Q;이렇게 사용하기도 한다. 

내가 해결한 방식은 시간복잡도 측면에서 좋은 성능을 내지 못한다. 조금 더 효율적으로 해결하는 방법을 찾아보는 것이 좋아보인다.