끄적끄적 개발공부

깊이/너비 우선 탐색(DFS/BFS) - 단어 변환

HYuk 2022. 6. 10. 01:38
728x90

문제 설명

두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.

1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
2. words에 있는 단어로만 변환할 수 있습니다.

예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.

두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 각 단어는 알파벳 소문자로만 이루어져 있습니다.
  • 각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
  • words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
  • begin과 target은 같지 않습니다.
  • 변환할 수 없는 경우에는 0를 return 합니다.
입출력 예begintargetwordsreturn
"hit" "cog" ["hot", "dot", "dog", "lot", "log", "cog"] 4
"hit" "cog" ["hot", "dot", "dog", "lot", "log"] 0
입출력 예 설명

예제 #1
문제에 나온 예와 같습니다.

예제 #2
target인 "cog"는 words 안에 없기 때문에 변환할 수 없습니다.

 

문제 풀이

 

Set에 문자를 담은 후, 시작문자에서 한글자씩 지운거랑 타겟문자에서 한글자씩 지운거를 비교하여 같은경우 재귀함수로 탐색해준다.

 

#include <string>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

void dfs(string& strCurrent, string& strTarget, int iCount
	, vector<int>& vecSort, set<string> sets)
{
	if (strCurrent == strTarget) // Target에 도달하게 되면 종료
	{
		vecSort.push_back(iCount);
		return;
	}
	for (auto strWords : sets) // Set에 있는 문자 순회
	{
		for (int i = 0; i < strCurrent.size(); ++i)
		{
			if ((strCurrent.substr(0, i) + strCurrent.substr(i + 1)) // 문자 중 알파벳 1개를 뺀 것이 같다면
				== (strWords.substr(0, i) + strWords.substr(i + 1)))
			{
				set<string> newset(sets);
				newset.erase(strWords); // newset이라는 곳에서 방금 탐색한 문자를 제외 해준 후,
				dfs(strWords, strTarget, iCount + 1, vecSort, newset); // 다음 탐색을 시작
			}
		}
	}
	return;
}

int solution(string begin, string target, vector<string> words) {
	set<string> setWords;
	for (auto& string : words) // Set에 담습니다.
		setWords.emplace(string);

	if (setWords.find(target) == setWords.end()) // 타겟이 벡터에 없으면 return 0
		return 0;

	vector<int> vecCounts; // target까지 가는데에 필요한 Count들을 모아둔 vector
	dfs(begin, target, 0, vecCounts, setWords); // 탐색을 합니다.

	sort(vecCounts.begin(), vecCounts.end()); // 오름차순 정렬

	return vecCounts[0];
}
728x90