문제&링크
https://www.acmicpc.net/problem/2589
풀이
1. 가장 먼 두 점 사이의 거리를 구하는 문제임으로 시간 초과를 고려하여 BFS로 문제를 해결한다.
2. 육지("L")로 이루어진 그래프가 여러 개 있을 수 있으므로, 모든 점을 기준으로 BFS를 구하고 거리의 최댓값을 구한다.
-> 시간복잡도를 줄이기 위해서 각 그래프 별로 한 점을 잡고 두 번의 BFS를 사용하여 그래프 내의 거리의 최댓값을 구할 수 있다. (트리의 지름 활용)
3. 각 점별로 BFS를 실행할 때마다 cstring 헤더 파일의 memset 함수를 이용해서 거리(dist) 및 방문 여부(check) 배열을 초기화한다.
4. BFS 함수를 통해 얻은 거리의 최댓값을 반환하도록 하여 다른 BFS 함수를 통해 얻은 거리의 최댓값과 비교한다.
코드
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
int N, M;
char map[51][51];
int dist[51][51] = {0};
bool check[51][51] = {false};
int bfs(int s_x, int s_y) {
memset(dist, 0, sizeof(dist));
memset(check, false, sizeof(check));
queue<pair<int, int>> q;
q.push(make_pair(s_x, s_y));
check[s_x][s_y] = true;
int max_dist = 0;
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int m_x = dx[i] + x;
int m_y = dy[i] + y;
if (m_x < 1 || m_y < 1 || m_x > N || m_y > M) continue;
if (map[m_x][m_y] == 'L' && !check[m_x][m_y]) {
dist[m_x][m_y] = dist[x][y] + 1;
check[m_x][m_y] = true;
max_dist = max(max_dist, dist[m_x][m_y]);
q.push(make_pair(m_x, m_y));
}
}
}
return max_dist;
}
int main() {
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> map[i][j];
}
}
int ans = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
if (map[i][j] == 'L') {
ans = max(ans, bfs(i, j));
}
}
}
cout << ans;
}
'Koala - 15기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[BOJ/C++] 1916번 : 최소비용 구하기 (0) | 2024.08.18 |
---|---|
[BOJ/Python] 13849번: 숨바꼭질 3 (0) | 2024.08.18 |
[백준/C++] 11279번: 최대 힙 (0) | 2024.08.18 |
[백준/Python] #13549 숨바꼭질3 (0) | 2024.08.15 |
[백준/C++] 27964번: 콰트로치즈피자 (0) | 2024.08.12 |