250715

lililllilillll·2025년 7월 15일

개발 일지

목록 보기
233/350

✅ What I did today


  • 이력서 리뉴얼
  • 백준


⚔️ 백준


3197 백조의 호수

틀린 풀이

#include"3197.h"
#define INF 0x3f3f3f3f
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
typedef pair<int, int> pii;

// 실수 1. using namespace std 뒤에 typedef 선언해야 되는거 몰랐음
// 실수 2. vector 제대로 초기화 안 하고 새로 선언으로 떼우려고 함.
// 실수 3. 물이랑 겹치는 것만 넣어야 되는데, 모든 얼음을 큐에 넣어버렸음.
// 실수 4. 오리 둘 다 bfs 때려야 얼음이 골고루 녹는데 한 오리만 bfs 때림
// 실수 5. 오리 둘 다 bfs 때려도 얼음이 감싼 얼음은 안 녹음. 따로 bfs 해야됨.

void B3197::Solution()
{
	fastio;

	// 얼음 녹인 뒤에 체크체크
	int R, C;
	string s;
	cin >> R >> C;
	vector<string> lake(R);
	for (int i = 0; i < R; i++) 
		cin >> lake[i];
	queue<pii> iceq;
	vector<pii> ducks;

	vector<int> dx = { 1,-1,0,0 };
	vector<int> dy = { 0,0,1,-1 };
	
	// 오리를 찾고, 얼음 큐 시작을 넣어놓는다.
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			if (lake[i][j] == 'L') {
				ducks.push_back(make_pair(i, j));
			}
			else if (lake[i][j] == 'X') {
				for (int k = 0; k < 4; k++) {
					int newi = i + dx[k];
					int newj = j + dy[k];
					if (0 <= newi && newi < R && 0 <= newj && newj < C
						&& lake[newi][newj] == '.') 
					{
						iceq.push(make_pair(i, j));
						break;
					}
				}
			}
		}
	}

	int day = 0;
	bool found = false;
	while (!iceq.empty())
	{
		queue<pii> duckq;
		vector<vector<bool>> visited(R, vector<bool>(C));
		pii duck0 = ducks[0];
		duckq.push(duck0);
		visited[duck0.first][duck0.second] = true;
		// 오리가 길 탐색 시도
		while (!duckq.empty())
		{
			pii d = duckq.front();
			duckq.pop();
			for (int i = 0; i < 4; i++) {
				int newx = d.first + dx[i];
				int newy = d.second + dy[i];
				if (0 <= newx && newx < R && 0 <= newy && newy < C
					&& !visited[newx][newy] && lake[newx][newy] != 'X')
				{
					if (lake[newx][newy] == 'L') found = true;
					else {
						visited[newx][newy] = true;
						duckq.push(make_pair(newx, newy));
					}
				}
			}
		}

		if (found) break;

		// 얼음 녹임
		int qlen = iceq.size();
		while (qlen--)
		{
			pii ice = iceq.front();
			iceq.pop();
			lake[ice.first][ice.second] = '.';
			for (int i = 0; i < 4; i++) {
				int newx = ice.first + dx[i];
				int newy = ice.second + dy[i];
				if (0 <= newx && newx < R && 0 <= newy && newy < C
					&& !visited[newx][newy] && lake[newx][newy] == 'X')
				{
					visited[newx][newy] = true;
					iceq.push(make_pair(newx, newy));
				}
			}
		}

		day++;
	}
	std::cout << day;
}

풀이 작성도 오래 걸렸고,
결국 결과도 시간 초과.
내일 다시 생각해보기.



profile
너 정말 **핵심**을 찔렀어

0개의 댓글