728x90
DFS๊ฐ ์๋๋ผ BFS ์ธ๊ฒ ๊ฐ๊ธดํ๋ฐ ์ผ๋จ ํจ์๋ช ์ ์ด๋ ๊ฒ dfs๋ก ํด๋ฒ๋ ธ๋ค. ์๋๊ฐ... ์์ง ๊ฐ๋ ์ด ํ์คํ ์กํ์ง ์์๋ฏ.. ์๋ฌดํผ DFS์ BFS๋ฅผ ํ ๋ ํ๋ผ๋ฏธํฐ๋ก ํ๋์ฉ ๋ฐ๋์ด์ ๋๊ฒจ์ง๊ฒ ๋๋ ๊ฒ์ Focus๋ฅผ ๋ง์ถ๋ค. ๊ทธ๋ฆฌ๊ณ visited๊ฐ ๊ฐ์ฅ ์ค์!! ๊ทธ๋ฆฌ๊ณ ์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ์ node๋ฅผ queue์ ๋ชจ๋ ๋ฃ๊ณ ์ดํผ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ dfs ์ฌ๊ท๋ฅผ ํ์ถํ๊ฒ ๋๋ฉด ์ด์ค for๋ฌธ ์ค nested๋ for๋ฌธ์์ visited ํ ๋ ธ๋์ visited๋ฅผ 0์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค๋ ๊ฒ์ด ํฌ์ธํธ
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int answer = 100;
string value;
vector<int> visited(50,0);
void dfs(string begin, string target, vector<string> words, int result) {
if(begin == target) {
if(answer > result) answer = result;
return ;
}
// word ๋ฐฐ์ด์ ๋ค์ด์๋ ๊ฐ์๋งํผ ๋ฐ๋ณต
for(int i = 0 ; i < words.size() ; i++) {
// count ๋ณ์๋ for๋ฌธ์ ๋ ๋๋ง๋ค ์ด๊ธฐํ๋ฅผ ํด์ค์ผ ํ๋ค.
int count = 0;
// words ๋ฐฐ์ด์ ๋จ์ด ํฌ๊ธฐ๋งํผ ๋ฐ๋ณต์ ํ๋ฉด์ ์ผ์นํ์ง ์๋ ๋ฌธ์์ ๊ฐ์๋ฅผ ์ธ์ค๋ค.
for(int j = 0 ; j < words[i].size() ; j++) {
if(begin[j] != words[i][j]) count++;
}
// ํ๋ฆฐ ๋ฌธ์์ ๊ฐ์๊ฐ 1๊ฐ์ด๋ฉด DFS๋ฅผ ์ค์ํ๋ค.
if(count == 1) {
// ๋ง์ฝ ํด๋น ๋จ์ด๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด
if(visited[i] == 0) {
// ๋ฐฉ๋ฌธ์ ํ๊ณ
visited[i] = 1;
// DFS๋ฅผ ์งํํ๋ค.
dfs(words[i], target, words, result+1);
/*
DFS๋ฅผ ํ์ถํ๋ค๋ ๊ฒ์ begin == target์ ์ํฉ์ ๋ง๋ฌ๊ณ
ํด๋น answer์ result ๊ฐ์ ๋ฃ์๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ๋ค์ 0์ผ๋ก ๋ฐ๊พธ๋ ์ด์ ๋ ์ด์ begin์์ Spell ์ด 1๊ฐ๊ฐ ๋ค๋ฅธ ๋จ์ด๊ฐ
์ฌ๋ฌ ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํด๋นํ๋ ๋จ์ด๋ก๋ ๋ฐ๋ ์ ์์ด์ผ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ
ํ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
*/
visited[i] = 0;
}
}
}
}
int solution(string begin, string target, vector<string> words) {
dfs(begin, target, words, 0);
// ๋ง์ฝ answer๊ฐ 100์ด๋ฉด result๊ฐ ๋ฐ๋์ง ์์๋ค๋ ๊ฒ์ด๊ณ ๋ฐ๋ ์ ์๋ค๋ ๊ฒ
if(answer == 100) answer = 0;
return answer;
}