BOJ 9328. ์ด์
๐โโ๏ธ[Gold I] ์ด์ - 9328
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2168 KB, ์๊ฐ: 248 ms
๋ถ๋ฅ
๋๋น ์ฐ์ ํ์, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๊ตฌํ
์ ์ถ ์ผ์
2024๋ 3์ 12์ผ 14:56:59
๋ฌธ์ ์ค๋ช
์๊ทผ์ด๋ 1์ธต ๋น๋ฉ์ ์นจ์ ํด ๋งค์ฐ ์ค์ํ ๋ฌธ์๋ฅผ ํ์ณ์ค๋ ค๊ณ ํ๋ค. ์๊ทผ์ด๊ฐ ๊ฐ์ง๊ณ ์๋ ํ๋ฉด๋์๋ ๋ฌธ์์ ์์น๊ฐ ๋ชจ๋ ๋ํ๋ ์๋ค. ๋น๋ฉ์ ๋ฌธ์ ๋ชจ๋ ์ ๊ฒจ์๊ธฐ ๋๋ฌธ์, ๋ฌธ์ ์ด๋ ค๋ฉด ์ด์ ๊ฐ ํ์ํ๋ค. ์๊ทผ์ด๋ ์ผ๋ถ ์ด์ ๋ฅผ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๊ณ , ์ผ๋ถ ์ด์ ๋ ๋น๋ฉ์ ๋ฐ๋ฅ์ ๋์ฌ์ ธ ์๋ค. ์๊ทผ์ด๋ ์ํ์ข์ฐ๋ก๋ง ์ด๋ํ ์ ์๋ค.
์๊ทผ์ด๊ฐ ํ์น ์ ์๋ ๋ฌธ์์ ์ต๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ํ ์คํธ ์ผ์ด์ค์ ์๋ 100๊ฐ๋ฅผ ๋์ง ์๋๋ค.
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ์ง๋์ ๋์ด์ ๋๋น h์ w (2 โค h, w โค 100)๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ h๊ฐ ์ค์๋ ๋น๋ฉ์ ๋ํ๋ด๋ w๊ฐ์ ๋ฌธ์๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ๋ฌธ์๋ ๋ค์ ์ค ํ๋์ด๋ค.
- '.'๋ ๋น ๊ณต๊ฐ์ ๋ํ๋ธ๋ค.
- '*'๋ ๋ฒฝ์ ๋ํ๋ด๋ฉฐ, ์๊ทผ์ด๋ ๋ฒฝ์ ํต๊ณผํ ์ ์๋ค.
- '$'๋ ์๊ทผ์ด๊ฐ ํ์ณ์ผํ๋ ๋ฌธ์์ด๋ค.
- ์ํ๋ฒณ ๋๋ฌธ์๋ ๋ฌธ์ ๋ํ๋ธ๋ค.
- ์ํ๋ฒณ ์๋ฌธ์๋ ์ด์ ๋ฅผ ๋ํ๋ด๋ฉฐ, ๊ทธ ๋ฌธ์์ ๋๋ฌธ์์ธ ๋ชจ๋ ๋ฌธ์ ์ด ์ ์๋ค.
๋ง์ง๋ง ์ค์๋ ์๊ทผ์ด๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ์ด์ ๊ฐ ๊ณต๋ฐฑ์์ด ์ฃผ์ด์ง๋ค. ๋ง์ฝ, ์ด์ ๋ฅผ ํ๋๋ ๊ฐ์ง๊ณ ์์ง ์๋ ๊ฒฝ์ฐ์๋ "0"์ด ์ฃผ์ด์ง๋ค.
์๊ทผ์ด๋ ์ฒ์์๋ ๋น๋ฉ์ ๋ฐ์ ์์ผ๋ฉฐ, ๋น๋ฉ ๊ฐ์ฅ์๋ฆฌ์ ๋ฒฝ์ด ์๋ ๊ณณ์ ํตํด ๋น๋ฉ ์ํ์ ๋๋๋ค ์ ์๋ค. ๊ฐ๊ฐ์ ๋ฌธ์ ๋ํด์, ๊ทธ ๋ฌธ์ ์ด ์ ์๋ ์ด์ ์ ๊ฐ์๋ 0๊ฐ, 1๊ฐ, ๋๋ ๊ทธ ์ด์์ด๊ณ , ๊ฐ๊ฐ์ ์ด์ ์ ๋ํด์, ๊ทธ ์ด์ ๋ก ์ด ์ ์๋ ๋ฌธ์ ๊ฐ์๋ 0๊ฐ, 1๊ฐ, ๋๋ ๊ทธ ์ด์์ด๋ค. ์ด์ ๋ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค ๋ง๋ค, ์๊ทผ์ด๊ฐ ํ์น ์ ์๋ ๋ฌธ์์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ํ์ด
๋ฌด์ํ ๋ฐฉ๋ฒ์ผ๋ก ํ์๋๋ฐ ํต๊ณผ๋๋ค..!!
bfs๋ก ๋ฌธ์ ๋ฅผ ํ์๊ณ , bfs๋ฅผ ๋๋ฆด ๋ ์๋ก์ด ํค๋ฅผ ๋ฐ์๋ค๋ฉด ๊ทธ ๊ณณ์์ ํ๋ฒ๋ bfs๋ฅผ ๋๋ ค์ผํ๋ค.
๋ชจ๋ ๋ฌธ์์ ํ๋ฒ์ฉ ๋๋ฆฌ๋ฉด ๋๋๋๊ฒ ์๋๋ผ ๋ง์ง๋ง ๋ฌธ์์ ์๋ก์ดํค๋ฅผ ์ป๊ณ ์ฒ์ ๋ฌธ์์ ์์ํด์ผ ์ด๋ฆฌ๋ ๊ตฌ์กฐ๊ฐ ์์ ์ ์์ผ๋ฏ๋ก ์ด์คfor๋ฌธ์ผ๋ก ๊ตฌํํ๋ค.
๐์ ์ฒด ์ฝ๋
#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 <queue>
#include <map>
using namespace std;
int _loopCnt = 0, _document = 0;
int _t, _h, _w, cnt = 0;
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
vector<vector<char>> _board;
vector<pair<int, int>> _gate;
vector<vector<bool>> _visited;
map<char, bool> _inventory;
bool BFS(int y, int x)
{
bool getKey = false;
if (_board[y][x] >= 'A' && _board[y][x] <= 'Z')
{
// ์ธ๋ฒคํ ๋ฆฌ ํ์ธ.
if (_inventory[_board[y][x] + 32] == true)
_board[y][x] = '.';
else
return false;
}
else if (_board[y][x] >= 'a' && _board[y][x] <= 'z')
{
_inventory[_board[y][x]] = true;
_board[y][x] = '.';
}
else if (_board[y][x] == '$')
{
cnt++;
_board[y][x] = '.';
}
queue<pair<int, int>> q;
q.push({ y, x });
_visited[y][x] = true;
pair<int, int> here;
while (q.empty() == false)
{
here = q.front();
q.pop();
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 0 || ny >(_h - 1) || nx < 0 || nx >(_w - 1))
continue;
if (_visited[ny][nx])
continue;
if (_board[ny][nx] == '*')
continue;
if (_board[ny][nx] == '.')
{
_visited[ny][nx] = true;
q.push({ ny, nx });
}
else if (_board[ny][nx] >= 'A' && _board[ny][nx] <= 'Z')
{
// ์ธ๋ฒคํ ๋ฆฌ ํ์ธ ํ์.
if (_inventory[_board[ny][nx] + 32] == true)
{
_board[ny][nx] = '.';
_visited[ny][nx] = true;
q.push({ ny, nx });
}
}
else if (_board[ny][nx] >= 'a' && _board[ny][nx] <= 'z')
{
_visited[ny][nx] = true;
q.push({ ny, nx });
_inventory[_board[ny][nx]] = true;
_board[ny][nx] = '.';
getKey = true;
}
else if (_board[ny][nx] == '$')
{
_visited[ny][nx] = true;
q.push({ ny, nx });
_board[ny][nx] = '.';
cnt++;
if (cnt == _document)
return false;
}
}
}
_visited.clear();
_visited = vector<vector<bool>>(_h, vector<bool>(_w));
if (getKey == true)
return true;
else
return false;
}
void solve()
{
cin >> _t;
for (int i = 0; i < _t; ++i)
{
cin >> _h >> _w;
cnt = 0;
_board.clear();
_board = vector<vector<char>>(_h, vector<char>(_w));
_visited.clear();
_visited = vector<vector<bool>>(_h, vector<bool>(_w));
_gate.clear();
_inventory.clear();
_loopCnt = 0;
_document = 0;
//_map.clear();
// ํ๋ฉด๋ ์
๋ ฅ
for (int y = 0; y < _h; ++y)
{
string str;
cin >> str;
for (int x = 0; x < _w; ++x)
{
_board[y][x] = str[x];
if ((x == 0 && _board[y][x] != '*') || (y == 0 && _board[y][x] != '*') || (x == _w - 1 && _board[y][x] != '*') || (y == _h - 1 && _board[y][x] != '*'))
_gate.push_back({ y, x });
if (_board[y][x] >= 'A' && _board[y][x] <= 'Z')
_loopCnt++;
if (_board[y][x] == '$')
_document++;
}
}
for (int key = 'a'; key < 'a' + 26; ++key)
{
_inventory[key] = false;
}
// ๊ฐ์ง๊ณ ์๋ ์ด์
string keys;
cin >> keys;
for (int key = 0; key < keys.size(); ++key)
{
_inventory[keys[key]] = true;
}
for (int l = 0; l < _gate.size(); ++l)
{
for (int k = 0; k < _gate.size(); ++k)
{
if (cnt == _document)
break;
if (BFS(_gate[k].first, _gate[k].second) == true)
{
k--;
}
}
}
cout << cnt << '\n';
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}