[プログラマー/C++]ワード変換
9753 ワード
📓 https://programmers.co.kr/learn/courses/30/lessons/43163
開始語として
したがって、
(wordsとtargetをパラメータとして一緒に置き,プログラマー形式で解く.
💡 重要なのは、すでに書いた単語を書き換えることができるようにすれば、タイムアウトして、必ず
💡また、一度にtargetに到着して終了するのではなく、複数のパスの中で最短レベルが現れるように選択するのでbacktracking後は
指定された
今stringは1つ1つと比較して、他の字数は1つの時です!その字で呼び直せばいいです(もちろんlevelを1つ増やします).
cppで文字列を単語ごとに比較する場合はstr.at(i)関数を使用します!
📓 問題を解く
⏱ 25'
枝を伸ばしたつもりでDFSで解いた質問の種類はDFS/BFSと書いてあるので、近づきやすいです.プログラマーはいつでもstringを使用します.よくat(i)を使うようです.ㅎ…開始語として
dfs
を用い、現在stringがtarget
になった場合、出力level(=depth)が最小となる.したがって、
dfs
の関数因子には、현재 string
およびlevel
が必要である.(wordsとtargetをパラメータとして一緒に置き,プログラマー形式で解く.
💡 重要なのは、すでに書いた単語を書き換えることができるようにすれば、タイムアウトして、必ず
bool visited
を使って並べ替えなければなりません!💡また、一度にtargetに到着して終了するのではなく、複数のパスの中で最短レベルが現れるように選択するのでbacktracking後は
visited=false
に変更します.dfs
で、延長する単語を選択するには、まずパスします.指定された
words
配列を回転させ、まだアクセスされていない文字列を見つけます.今stringは1つ1つと比較して、他の字数は1つの時です!その字で呼び直せばいいです(もちろんlevelを1つ増やします).
cppで文字列を単語ごとに比較する場合はstr.at(i)関数を使用します!
コード#コード#
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int answer = 2147000000;
bool visited[51];
void dfs(string str, int L, string target, vector<string> words){
if(str==target){
answer=min(answer,L);
return;
}
for(int i=0;i<words.size();i++){
if(visited[i]) continue;
string str2=words[i]; //비교할 단어
int cnt=0;
//한 글자씩 비교해보기
for(int j=0;j<str.size();j++){
if(str2.at(j)!=str.at(j)) cnt++;
}
//다른 글자가 1개라면 해당 글자로 가지 뻗기
if(cnt==1){
visited[i]=true;
dfs(str2, L+1, target, words);
visited[i]=false;
}
}
}
int solution(string begin, string target, vector<string> words) {
//target이 words안에 있나
bool found=false;
for(int i=0;i<words.size();i++){
if(target==words[i]){
found=true;
break;
}
}
if(!found) return 0;
dfs(begin, 0, target, words);
return answer;
}
Reference
この問題について([プログラマー/C++]ワード変換), 我々は、より多くの情報をここで見つけました https://velog.io/@inryu/프로그래머스-C-단어-변환テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol