250910

lililllilillll·2025년 9월 10일

개발 일지

목록 보기
290/350

✅ 한 것들


  • 자소서 작성
  • 백준
  • 포폴 수정 및 추가


⚔️ 백준


9376 탈옥

#include"9376.h"
using namespace std;

typedef vector<vector<char>> vvc;
typedef vector<vector<int>> vvi;
typedef vector<vector<bool>> vvb;
typedef pair<int, int> pii;

bool ExceedRange(int newi, int newj, int h, int w)
{
	return newi >= h + 2 || newi < 0 || newj >= w + 2 || newj < 0;
}

void DrawMinDoor(pii start, vvc& prison, vvi& notepad, vvb& visited, int h, int w)
{
	visited = vvb(h + 2, vector<bool>(w + 2, false));
	deque<pii> dq;
	dq.push_front(start);
	int si = start.first;
	int sj = start.second;
	visited[si][sj] = true;
	// bfs를 한다
	// 문을 발견하면 잠시 담아둔다
	vector<pii> dirs = { {-1,0},{1,0},{0,-1},{0,1} };
	while (!dq.empty())
	{
		pii df = dq.front(); dq.pop_front();
		int doorCount = notepad[df.first][df.second];
		for (pii dir : dirs)
		{
			int newi = df.first + dir.first;
			int newj = df.second + dir.second;
			if (ExceedRange(newi, newj, h, w)) continue;
			if (visited[newi][newj]) continue;
			if (prison[newi][newj] == '#')
			{
				visited[newi][newj] = true;
				notepad[newi][newj] = doorCount + 1;
				dq.push_back({ newi,newj });
			}
			else if (prison[newi][newj] != '*')
			{
				visited[newi][newj] = true;
				notepad[newi][newj] = doorCount;
				dq.push_front({ newi,newj });
			}
		}
	}
}

int GetMinDoor(int h, int w)
{
	pii prisoner1 = { 0,0 }, prisoner2;
	vvc prison = vvc(h + 2, vector<char>(w + 2, '.'));
	for (int i = 1; i <= h; i++)
	{
		for (int j = 1; j <= w; j++)
		{
			cin >> prison[i][j];
			if (prison[i][j] == '$')
			{
				if (prisoner1 == make_pair(0, 0)) { prisoner1 = { i,j }; }
				else { prisoner2 = { i,j }; }
			}
		}
	}

	vvb visited;
	vvi sangen = vvi(h + 2, vector<int>(w + 2, 0));
	vvi mindoor1 = vvi(h + 2, vector<int>(w + 2, 0));
	vvi mindoor2 = vvi(h + 2, vector<int>(w + 2, 0));

	// bfs 하는데, 문을 발견하면 일단 담아두고 다음 턴에
	// start와, 기록할 곳을 건넨다
	DrawMinDoor({ 0,0 }, prison, sangen, visited, h, w);
	DrawMinDoor(prisoner1, prison, mindoor1, visited, h, w);
	DrawMinDoor(prisoner2, prison, mindoor2, visited, h, w);

	// sangen + mindoor1 + mindoor2 더한게 최소인거 찾는다
	int minDoor = 1000001;
	for (int i = 0; i < h + 2; i++)
	{
		for (int j = 0; j < w + 2; j++)
		{
			if (!visited[i][j]) continue;
			int door = sangen[i][j] + mindoor1[i][j] + mindoor2[i][j];
			if (prison[i][j] == '#') door -= 2;
			minDoor = min(minDoor, door);
		}
	}

	return minDoor;
}


void B9376::Solution()
{
	int t, h, w;
	cin >> t;
	while (t--)
	{
		cin >> h >> w;
		cout << GetMinDoor(h,w) << '\n';
	}
}
  • 사방이 벽으로 둘러싸서 방문하지 못하는 점이 있으면 최소 취급을 해주면 안된다
  • 그걸 visited로 체크할 거면 doorCount 체크 하지 않을 때는 visited = true도 안되게 해야 했는데 무조건 true되는 것 때문에 헤맴
profile
너 정말 **핵심**을 찔렀어

0개의 댓글