BOJ 2589. ๋ณด๋ฌผ์ฌ
๐โโ๏ธ[Gold V] ๋ณด๋ฌผ์ฌ - 2589
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2156 KB, ์๊ฐ: 164 ms
๋ถ๋ฅ
๋๋น ์ฐ์ ํ์, ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์
์ ์ถ ์ผ์
2024๋ 6์ 9์ผ 13:31:35
๋ฌธ์ ์ค๋ช
๋ณด๋ฌผ์ฌ ์ง๋๋ฅผ ๋ฐ๊ฒฌํ ํํฌ ์ ์ฅ์ ๋ณด๋ฌผ์ ์ฐพ์๋์ฐ๋ค. ๋ณด๋ฌผ์ฌ ์ง๋๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ง์ฌ๊ฐํ ๋ชจ์์ด๋ฉฐ ์ฌ๋ฌ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ ์นธ์ ์ก์ง(L)๋ ๋ฐ๋ค(W)๋ก ํ์๋์ด ์๋ค. ์ด ์ง๋์์ ์ด๋์ ์ํ์ข์ฐ๋ก ์ด์ํ ์ก์ง๋ก๋ง ๊ฐ๋ฅํ๋ฉฐ, ํ ์นธ ์ด๋ํ๋๋ฐ ํ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๋ณด๋ฌผ์ ์๋ก ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋๋ฐ ์์ด ๊ฐ์ฅ ๊ธด ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ก์ง ๋ ๊ณณ์ ๋๋์ด ๋ฌปํ์๋ค. ์ก์ง๋ฅผ ๋ํ๋ด๋ ๋ ๊ณณ ์ฌ์ด๋ฅผ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ค๋ฉด ๊ฐ์ ๊ณณ์ ๋ ๋ฒ ์ด์ ์ง๋๊ฐ๊ฑฐ๋, ๋ฉ๋ฆฌ ๋์๊ฐ์๋ ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ด ์ง๋๊ฐ ์ฃผ์ด์ก๋ค๋ฉด ๋ณด๋ฌผ์ ์๋ ํ์๋ ๋ ๊ณณ์ ๋ฌปํ ์๊ฒ ๋๊ณ , ์ด ๋ ์ฌ์ด์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ์๊ฐ์ 8์๊ฐ์ด ๋๋ค.
๋ณด๋ฌผ ์ง๋๊ฐ ์ฃผ์ด์ง ๋, ๋ณด๋ฌผ์ด ๋ฌปํ ์๋ ๋ ๊ณณ ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ๋ณด๋ฌผ ์ง๋์ ์ธ๋ก์ ํฌ๊ธฐ์ ๊ฐ๋ก์ ํฌ๊ธฐ๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ด์ด L๊ณผ W๋ก ํ์๋ ๋ณด๋ฌผ ์ง๋๊ฐ ์๋์ ์์ ๊ฐ์ด ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ๋ฌธ์ ์ฌ์ด์๋ ๋น ์นธ์ด ์๋ค. ๋ณด๋ฌผ ์ง๋์ ๊ฐ๋ก, ์ธ๋ก์ ํฌ๊ธฐ๋ ๊ฐ๊ฐ 50์ดํ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ณด๋ฌผ์ด ๋ฌปํ ์๋ ๋ ๊ณณ ์ฌ์ด๋ฅผ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ํ๋ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ํ์ด
์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผํ๋ฏ๋ก ๋ค์ต์คํธ๋ผ๋ฅผ ํ์ฉํ์๋ค.
bfs๋ฅผ ์ด์ฐจ์ ๋ฐฐ์ด์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
// BFS๋ฅผ ์ด์ฉํ์ฌ ๊ฐ ์ก์ง ์นธ์์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์
int bfs(vector<vector<char>>& grid, int x, int y)
{
int n = grid.size();
int m = grid[0].size();
vector<vector<bool>> visited(n, vector<bool>(m, false));
queue<pair<pair<int, int>, int>> q;
q.push({ {x, y}, 0 });
visited[x][y] = true;
int maxDistance = 0;
while (!q.empty())
{
int cx = q.front().first.first;
int cy = q.front().first.second;
int distance = q.front().second;
q.pop();
maxDistance = max(maxDistance, distance);
for (int i = 0; i < 4; ++i)
{
int nx = cx + dx[i];
int ny = cy + dy[i];
if (isValid(nx, ny, n, m) && !visited[nx][ny] && grid[nx][ny] == 'L')
{
q.push({ {nx, ny}, distance + 1 });
visited[nx][ny] = true;
}
}
}
return maxDistance;
}
dx, dy์ ์์น๊ฐ grid์ ๋ฒ์ด๋๋์ง ํ์ธํ๋ ํจ์๋ ๋ง๋ค์๋ค.
// ์ํ์ข์ฐ ์ด๋์ ์ํ ๋ฐฐ์ด
const int dx[] = { 1, -1, 0, 0 };
const int dy[] = { 0, 0, 1, -1 };
// ์ง๋์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋์ง ํ์ธํ๋ ํจ์
bool isValid(int x, int y, int n, int m)
{
return x >= 0 && x < n && y >= 0 && y < m;
}
์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ bfs๋ฅผ ์ก์ง ํ์นธ๋น ๋๋ ค์ผํ๊ณ ๊ทธ ์ค ์ต๋๊ฐ์ ๊ตฌํด์ผํ๋ค.
// ๋ณด๋ฌผ์ด ๋ฌปํ ์๋ ๋ ๊ณณ ์ฌ์ด์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์
int shortestTreasureDistance(vector<vector<char>>& grid)
{
int n = grid.size();
int m = grid[0].size();
int maxDistance = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
if (grid[i][j] == 'L')
{
maxDistance = max(maxDistance, bfs(grid, i, j));
}
}
}
return maxDistance;
}
๐์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <climits>
#include <queue>
using namespace std;
// ์ํ์ข์ฐ ์ด๋์ ์ํ ๋ฐฐ์ด
const int dx[] = { 1, -1, 0, 0 };
const int dy[] = { 0, 0, 1, -1 };
// ์ง๋์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋์ง ํ์ธํ๋ ํจ์
bool isValid(int x, int y, int n, int m)
{
return x >= 0 && x < n && y >= 0 && y < m;
}
// BFS๋ฅผ ์ด์ฉํ์ฌ ๊ฐ ์ก์ง ์นธ์์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์
int bfs(vector<vector<char>>& grid, int x, int y)
{
int n = grid.size();
int m = grid[0].size();
vector<vector<bool>> visited(n, vector<bool>(m, false));
queue<pair<pair<int, int>, int>> q;
q.push({ {x, y}, 0 });
visited[x][y] = true;
int maxDistance = 0;
while (!q.empty())
{
int cx = q.front().first.first;
int cy = q.front().first.second;
int distance = q.front().second;
q.pop();
maxDistance = max(maxDistance, distance);
for (int i = 0; i < 4; ++i)
{
int nx = cx + dx[i];
int ny = cy + dy[i];
if (isValid(nx, ny, n, m) && !visited[nx][ny] && grid[nx][ny] == 'L')
{
q.push({ {nx, ny}, distance + 1 });
visited[nx][ny] = true;
}
}
}
return maxDistance;
}
// ๋ณด๋ฌผ์ด ๋ฌปํ ์๋ ๋ ๊ณณ ์ฌ์ด์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์
int shortestTreasureDistance(vector<vector<char>>& grid)
{
int n = grid.size();
int m = grid[0].size();
int maxDistance = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
if (grid[i][j] == 'L')
{
maxDistance = max(maxDistance, bfs(grid, i, j));
}
}
}
return maxDistance;
}
int main()
{
FILE* stream;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen_s(&stream, "input.txt", "rt", stdin);
int n, m;
cin >> n >> m;
vector<vector<char>> board = vector<vector<char>>(n, vector<char>(m));
// ์์ ์
๋ ฅ
for (int y = 0; y < n; ++y)
{
for (int x = 0; x < m; ++x)
{
cin >> board[y][x];
}
}
// ์ต๋จ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
cout << shortestTreasureDistance(board) << endl; // ์ถ๋ ฅ: 8
return 0;
}