λ΄ νμ΄
- μ£Όμ΄μ§ μ¬κ°νλ€μ λ΄λΆμ ν¬ν¨λμ§ μμ μΈκ³½μ μ λ°λΌ DFS νμμ νμ¬ λ¬Έμ λ₯Ό νμλ€.
- νμ§λ§ ‘μ¬κ°ν λ΄λΆμ ν¬ν¨λμ§ μμ μΈκ³½μ ’ μ΄λΌλ 쑰건μ λ°λΌ 1μ© μ΄λνλ©° μΈκ³½μ μ νμνλ©΄ μλμ κ°μ μμμμ λ¬Έμ κ° μκΈ΄λ€.
- λ°λ‘ κ°κ²©μ΄ 1μ΄λ©΄μ μΈκ³½μ μΌλ‘ μ°κ²°λμ§ μμ μμμ΄λ€.
- μ΄ μμμ μΈκ³½μ μΌλ‘ μ°κ²°λμ§ μμμ§λ§, νμ¬ μμΉμ κ°κ²©μ΄ 1μ΄λ©΄μ μ¬κ°ν λ΄λΆμ ν¬ν¨λμ§ μμ μΈκ³½μ μ΄λ―λ‘ λ΄κ° μ€μ ν 쑰건μ μ°Έμ΄ λλ€.
- μ΄κ²μ λ°©μ§νκΈ° μν΄ μ’νκ°μ 2λ°°λ‘ ν λ€ 1μ© νμνμλ€. μ΄λ κ² νλ©΄ μλ³Έμμ μΈκ³½μ μΌλ‘ μ΄μ΄μ§μ§ μμ μ’νλ₯Ό ꡬλ³ν΄λΌ μ μλ€.
λ΄ ν΄λ΅
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
#include <iostream>
using namespace std;
int solution(vector<vector<int>> rectangle, int characterX, int characterY, int itemX, int itemY) {
int answer = 0;
vector<int> counters;
stack<pair<int, int>> s;
vector<vector<bool>> visit(101, vector<bool>(101, false));
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
// μμμ μ
λ ₯ (μ’ν 2λ°°)
s.push(make_pair(characterX * 2, characterY * 2));
int count = -1;
while(!s.empty())
{
int X = s.top().first;
int Y = s.top().second;
s.pop();
// μ΄λ―Έ λ°©λ¬Ένμ μμΌλ©΄ νμ x
if(visit[X][Y])
continue;
// λ°©λ¬Έ νμ μ¦κ°
++count;
// λͺ©νμ§μ (μ’ν 2λ°°)μ΄λΌλ©΄ μΉ΄μ΄νΈ λͺ©λ‘μ μΆκ°
if(X == itemX * 2 && Y == itemY * 2)
{
counters.push_back(count);
count = 0;
continue;
}
// λͺ©νμ§μ μ΄ μλλΌλ©΄ λ°©λ¬Έ 체ν¬
visit[X][Y] = true;
// λ€μ μμΉ μ°ΎκΈ°
for(int i = 0; i < 4; ++i)
{
int nX = X + dx[i];
int nY = Y + dy[i];
// λ²μ λ°μΌ κ²½μ°
if(nX < 0 || nX > 100 || nY < 0 || nY > 100)
continue;
if(!visit[nX][nY])
{
bool isOutline = false;
for(const auto& r : rectangle)
{
// μ¬κ°ν μ’ν 2λ°°
int lbX = r[0] * 2;
int rtX = r[2] * 2;
int lbY = r[1] * 2;
int rtY = r[3] * 2;
// ν μ μ΄λΌλ μ¬κ°ν λ΄λΆλΌλ©΄ μΈκ°μ μ΄ μλλ€
if(nX > lbX && nY > lbY && nX < rtX && nY < rtY)
{
isOutline = false;
break;
}
// μΈκ³½μ ν
μ€νΈ
// xμΆ
if(nX == lbX || nX == rtX)
{
if(nY >= lbY && nY <= rtY)
{
isOutline = true;
continue;
}
}
// yμΆ
if(nY == lbY || nY == rtY)
{
if(nX >= lbX && nX <= rtX)
{
isOutline = true;
continue;
}
}
}
// μμλΌμΈ μμ μμ κ²½μ°
if(isOutline)
{
s.push(make_pair(nX, nY));
}
}
}
}
answer = *min_element(counters.begin(), counters.end());
answer /= 2;
return answer;
}