๋ด ํ์ด
- ์ฃผ์ด์ง ์ฌ๊ฐํ๋ค์ ๋ด๋ถ์ ํฌํจ๋์ง ์์ ์ธ๊ณฝ์ ์ ๋ฐ๋ผ 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;
}