문제 링크

요약

  • 그래프가 주어져있지 않은 상황에서도 그래프 문제인지를 생각해볼 수 있어야 한다.

최종

  • BFS로 분류되어있긴 한데, 보니까 BFS 사용하는 그래프 문제여서 그래프에 넣어놓았음.
  • 각 word에 대해, 한문자 차이면 connected 된걸로 해서 몇번의 step 만에 다음 node에 도달할 수 있는지 BFS로 찾으면 된다.
#include <string>
#include <vector>
#include <queue>
 
using namespace std;
 
#define PACK(step, idx) (((step) << 16) | ((idx) & 0xFFFF))
#define UNPACK_STEP(pack) (((pack) >> 16) & 0xFFFF)
#define UNPACK_IDX(pack) ((pack) & 0xFFFF)
 
#define bms unsigned long long
 
int solution(string begin, string target, vector<string> words) {
	int target_idx = -1;
	vector<vector<int>> conn(words.size());
	queue<int> q;
	bms visited = 0;
 
	for (int i = 0; i < words.size(); i++) {
		if (target == words[i]) {
			target_idx = i;
		}
 
		for (int j = i + 1; j < words.size(); j++) {
			int distance = 0;
 
			for (int n = 0; n < begin.size(); n++) {
				distance += (words[i][n] != words[j][n]);
			}
 
			if (distance == 1) {
				conn[i].push_back(j);
				conn[j].push_back(i);
			}
		}
	}
 
	if (target_idx == -1) {
		return 0;
	}
 
	for (int i = 0; i < words.size(); i++) {
		int distance = 0;
 
		for (int n = 0; n < begin.size(); n++) {
			distance += (words[i][n] != begin[n]);
		}
 
		if (distance == 1) {
			
			q.push(PACK(1, i));
			visited |= (1 << i);
		}
	}
 
	while (!q.empty()) {
		int pack = q.front();
		int step = UNPACK_STEP(pack);
		int idx = UNPACK_IDX(pack);
		q.pop();
 
		if (idx == target_idx) {
			return step;
		}
 
		for (auto next : conn[idx]) {
			if (!((visited >> next) & 0x1)) {
				q.push(PACK(step + 1, next));
				visited |= (1 << next);
			}
		}
	}
 
	return 0;
}