โจ BFS/DFS
https://school.programmers.co.kr/learn/courses/30/lessons/43163#
๐ ๊ณ ๋ คํด์ผํ ์
- ํ ๋ฒ์ ํ ๊ฐ์ ์ํ๋ฒณ๋ง ๋ณ๊ฒฝ ๊ฐ๋ฅ
- begin์์ target์ผ๋ก ๋ณํํ๋ ๊ฐ์ฅ ์งง์ ๋ณํ ๊ณผ์ ์ฐพ๊ธฐ
- ๊ตณ์ด ๋ฐฐ์ด์ ์์๋๋ก ์ฐพ์ ํ์ ์์
๐น๏ธ ํ์ด๊ณผ์
๐ ์ด ๋ฌธ์ ๊ฐ์ ๊ฒฝ์ฐ DFS์ BFS ๋ชจ๋ ํ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง DFS๋ก ๊ตฌํํ ์์๋ ์๊ฐ๋ณต์ก๋๊ฐ ํฌ๋ค.
๐น DFS
- words ๋ฐฐ์ด์์ ํ์ฌ ๋จ์ด์ ํ ๊ธ์๋ง ๋ค๋ฅธ ๋จ์ด๋ฅผ ํ์ํ๋ค. ๐ ์ค๋ณต ํ์์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ํ ๋จ์ด๋ฅผ ๋ฐฉ๋ฌธํ๋ค๋ ํ์๋ฅผ ํด๋๋ค.
- ํ์ํ ๋จ์ด๊น์ง ๋ฐฉ๋ฌธํ ํ์(๊ฑฐ๋ฆฌ)๋ฅผ ๊ธฐ๋กํ๋ฉฐ ํ์ํ ๋จ์ด ๊ธฐ์ค์ผ๋ก ๋ค์ ํ์ํ๋ค.
- target ๋จ์ด๋ฅผ ๋ง๋๊ฒ ๋๋ฉด ์ง๊ธ๊น์ง์ ๋ฐฉ๋ฌธ ํ์(๊ฑฐ๋ฆฌ)๋ฅผ ๋น๊ตํ๋ฉฐ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค.
๐น BFS
- DFS์ 1๋ฒ๊ณผ ๋์ผ
- ์กฐ๊ฑด์ ํด๋น(ํ์ฌ ๋จ์ด์ ํ ๊ธ์๋ง ๋ค๋ฆ)ํ๋ ๋จ์ด๋ค์ queue์ ๋ฃ๋๋ค.
- queue์ ๋ด๊ฒจ์ง ๋จ์ด๋ค์ ๊ธฐ์ค์ผ๋ก ๋ค์ ํ์ํ๋ค.
- target ๋จ์ด๋ฅผ ๋ง๋๋ฉด ํ์ฌ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
๐ฉ๐ป ์ ์ฒด ์ฝ๋ - DFS
class Solution {
static int min = Integer.MAX_VALUE;
static void dfs(int depth, int start, String target, String begin, String[] words, boolean[] visit){
if(begin.equals(target)){
min = Math.min(min, depth);
return;
}
if(depth==words.length) return;
for(int i=0; i<words.length; i++){
if(visit[i]) continue;
String next = words[i];
// ๋ณํํ ์ ์๋ ๊ท์น = ํ ๊ฐ์ ์ํ๋ฒณ๋ง ๋ณํ ๊ฐ๋ฅ
int cnt=0;
for(int j=0; j<begin.length(); j++){
if(next.charAt(j)!=begin.charAt(j)) cnt++;
}
if(cnt==1 && !visit[i]){
visit[i] = true;
dfs(depth+1, i+1, target, next, words, visit);
visit[i] = false;
}
}
}
public int solution(String begin, String target, String[] words) {
boolean[] visit = new boolean[words.length];
for(int i=0; i<words.length; i++){
visit = new boolean[words.length];
dfs(0, 0, target, begin, words, visit);
}
if(min==Integer.MAX_VALUE) return min=0;
else return min;
}
}
๐ฉ๐ป ์ ์ฒด ์ฝ๋ - BFS
import java.util.LinkedList;
import java.util.Queue;
class Solution {
static class Node {
String next;
int edge;
public Node(String next, int edge) {
this.next = next;
this.edge = edge;
}
}
public int solution(String begin, String target, String[] words) {
int n = words.length, ans = 0;
Queue<Node> q = new LinkedList<>();
boolean[] visit = new boolean[n];
q.add(new Node(begin, 0));
while(!q.isEmpty()) {
Node cur = q.poll();
if (cur.next.equals(target)) {
ans = cur.edge;
break;
}
for (int i=0; i<n; i++) {
if (!visit[i] && isNext(cur.next, words[i])) {
visit[i] = true;
q.add(new Node(words[i], cur.edge + 1));
}
}
}
return ans;
}
static boolean isNext(String cur, String n) {
int cnt = 0;
for (int i=0; i<n.length(); i++) {
if (cur.charAt(i) != n.charAt(i)) {
if (++ cnt > 1) return false;
}
}
return true;
}
}