두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.
두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.
BFS
를 하여 최단 거리를 구한다.target인지 아닌지 확인하는 코드의 위치가 문제였다.
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
vector<int> graph[50];
vector<int> right_next_node;
bool visited[50];
bool can_convert(string w1, string w2){
int len = w1.size();
int count = 0;
for(int i=0; i<len; i++){
if(w1[i] == w2[i]) count++;
}
return len-1 == count ? true : false;
}
void fill_graph(string begin, vector<string> words){
for(int i = 0; i<words.size()-1; i++){
string current_word = words[i];
for(int j = i+1; j<words.size(); j++){
string word_to_compare = words[j];
if(can_convert(current_word, word_to_compare)){
graph[i].push_back(j);
graph[j].push_back(i);
}
}
}
}
void find_right_next_node(string s, vector<string> words){
for(int i=0; i<words.size(); i++){
string word_to_compare = words[i];
if(can_convert(s, word_to_compare)) right_next_node.push_back(i);
}
}
int bfs(int target){
if(target == -1) return 0;
queue<pair<int, int>> q;
for(int i=0; i<right_next_node.size(); i++){
int next_node = right_next_node[i];
visited[next_node] = true;
q.push({next_node, 1});
}
while(!q.empty()){
int current_node = q.front().first;
int current_depth = q.front().second;
if(current_node == target) return current_depth;
q.pop();
for(int i=0; i<graph[current_node].size(); i++){
int next_node = graph[current_node][i];
if(visited[next_node]) continue;
visited[next_node] = true;
q.push({next_node, current_depth+1});
}
}
return 0;
}
int solution(string begin, string target, vector<string> words) {
fill_graph(begin, words);
find_right_next_node(begin, words);
int begin_index, target_index=-1;
for(int i=0; i<words.size(); i++){
if(words[i]==begin) begin_index = i;
else if(words[i] == target) target_index = i;
}
int answer = bfs(target_index);
return answer;
}
(word, depth)
쌍으로 queue를 만든다.(begin, 0)
을 삽입한다.target
과 같다면 해당 depth를 answer에 저장하고 반복문을 종료한다.#include <string>
#include <vector>
#include <queue>
using namespace std;
int solution(string begin, string target, vector<string> words) {
int answer = 0;
bool visited[50] = {0, };
queue<pair<string, int>> q;
q.push({begin, 0});
while (!q.empty()) {
string word = q.front().first;
int depth = q.front().second;
q.pop();
if (word == target) {
answer = depth;
break;
}
for (int i = 0; i < words.size(); ++i) {
if (visited[i]) continue;
int count = 0;
for (int j = 0; j < words[i].size(); ++j) {
if (word[j] == words[i][j]) count++;
}
if (count == words[i].size() - 1) {
q.push({words[i], depth + 1});
visited[i] = true;
}
}
}
return answer;
}
function solution(begin, target, words) {
let answer = 10e9;
let visited = Array(words.length).fill(false);
function dfs(word, cnt) {
if (word === target) {
answer = Math.min(answer, cnt);
}
else {
for (let i = 0; i < words.length; i++) {
if (visited[i]) continue;
let match = 0;
for (let j = 0; j < words[i].length; j++) {
if (words[i][j] === word[j]) match++;
}
if (match === word.length - 1) {
visited[i] = true;
dfs(words[i], cnt + 1);
visited[i] = false;
}
}
}
}
dfs(begin, 0)
answer = answer === 10e9 ? 0 : answer;
return answer;
}