알고리즘 스터디
[백준] 17086 아기 상어 2 (C++)
coding_
2021. 10. 30. 19:34
728x90
반응형
17086 아기 상어 2
1. 문제
2. 접근법
[ 문제 접근 ]
두 아기 상어와 안전거리의 최댓값을 구하는 문제이다.
이때 안전거리는 각 좌표에서 아기 상어와 떨어진 거리이며 BFS를 사용하여 각 좌표에서 떨어진 상어와의 거리를 구해서 거리의 최댓값을 구하면 된다.
1. 상어의 위치에 대한 map을 입력받는다.
2. map에 상어가 존재하는 좌표를 모두 큐에 넣는다.
3. 각 상어의 위치부터 BFS를 진행하면서 상어가 존재하지 않는 좌표(0)인 경우 이동거리를 맵에 저장한다.
4. map을 완전탐색하여 맵에 저장된 최댓값이 안전거리의 최댓값이 되는데 1부터 시작했기 때문에 최댓값에서 1을 빼줘야 한다.
3. 코드
#include <iostream>
#include <algorithm>
#include <queue>
#define INF 987654321
using namespace std;
//BFS 사용
//각 좌표에서 아기상어와 떨어진 거리가 안전거리
int n, m, ret;
int map[51][51];
//대각선까지 방향설정
const int dr[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
const int dc[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
//안전거리를 구하기 위한 구조체
struct Pos
{
int r, c;
};
queue<Pos> q;
int BFS()
{
while (!q.empty())
{
Pos curr = q.front();
q.pop();
Pos next;
for (int i = 0; i < 8; ++i)
{
next.r = curr.r + dr[i];
next.c = curr.c + dc[i];
if (next.r < 0 || next.r >= n || next.c < 0 || next.c >= m)
continue;
//빈칸인 경우
if (!map[next.r][next.c])
{
//구한 안전거리의 좌표를 넣는다.
q.push(next);
//이때 좌표값은 현재 거리+1
map[next.r][next.c] = map[curr.r][curr.c] + 1;
}
}
}
//안전거리의 최댓값을 구함
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
if (ret < map[i][j])
ret = map[i][j];
}
}
//상어의 위치인 1부터 시작했으므로 1을 빼준다
return ret - 1;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
cin >> map[i][j];
//상어가 있는 위치인 1부터 시작한다.
if (map[i][j])
q.push({ i, j });
}
}
cout << BFS() << "\n";
return 0;
}
4. 시간 복잡도
BFS 알고리즘을 이용하였으며 O(n*m)의 시간 복잡도를 가진다.
5. 결과
728x90
반응형