๋ฐ์ํ
๐ ๋ฌธ์
๐ก ํ์ด
BFS(๋๋น ์ฐ์ ํ์) ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ "begin" ๋ฌธ์์ด์์ "target" ๋ฌธ์์ด๋ก ๋ณํํ๋๋ฐ ํ์ํ ์ต์ ๋จ๊ณ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
import java.util.*;
class Solution {
public int solution(String begin, String target, String[] words) {
int answer = 0; // ์ต์ ๋จ๊ณ ์๋ฅผ ์ ์ฅํ ๋ณ์
boolean[] visited = new boolean[words.length]; // ๋จ์ด ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ถ์ ํ๋ ๋ฐฐ์ด
Queue<String> queue = new LinkedList<>(); // BFS ํ์์ ์ํ ํ
queue.offer(begin); // ์์ ๋จ์ด๋ฅผ ํ์ ์ถ๊ฐ
while (!queue.isEmpty()) { // ํ๊ฐ ๋น์ด์์ง ์์ ๋์ ๋ฐ๋ณต
int size = queue.size(); // ํ์ฌ ๋ ๋ฒจ์ ํ ํฌ๊ธฐ๋ฅผ ์ ์ฅ
for (int i = 0; i < size; i++) {
String current = queue.poll(); // ํ์์ ํ์ฌ ๋จ์ด ์ถ์ถ
if (current.equals(target)) { // ํ์ฌ ๋จ์ด๊ฐ ๋ชฉํ ๋จ์ด์ธ ๊ฒฝ์ฐ
return answer; // ์ต์ ๋จ๊ณ ์ ๋ฐํ
}
for (int j = 0; j < words.length; j++) {
if (!visited[j] && canTransform(current, words[j])) {
// ๋จ์ด ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์ธ ๋ฐ ๋ณํ ๊ฐ๋ฅํ ๊ฒฝ์ฐ
visited[j] = true; // ๋จ์ด๋ฅผ ๋ฐฉ๋ฌธ์ผ๋ก ํ์
queue.offer(words[j]); // ํ์ ์ถ๊ฐ
}
}
}
answer++; // ํ์ฌ ๋ ๋ฒจ์ ๋ชจ๋ ๋จ์ด๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋จ๊ณ ์ฆ๊ฐ
}
return 0; // ๋ณํํ ์ ์๋ ๊ฒฝ์ฐ
}
private boolean canTransform(String from, String to) {
int diffCount = 0; // ๋ฌธ์ ์ฐจ์ด๋ฅผ ๋ํ๋ผ ๋ณ์ ์ด๊ธฐํ
for (int i = 0; i < from.length(); i++) {
if (from.charAt(i) != to.charAt(i)) {
diffCount++; // ๋ค๋ฅธ ๋ฌธ์๊ฐ ๋ฐ๊ฒฌ๋ ๋๋ง๋ค ์ฆ๊ฐ
}
if (diffCount > 1) {
return false; // ๋ฌธ์ ์ฐจ์ด๊ฐ 1์ ์ด๊ณผํ๋ฉด ๋ณํ ๋ถ๊ฐ๋ฅ
}
}
return diffCount == 1; // ๋ฌธ์ ์ฐจ์ด๊ฐ 1์ด๋ฉด ๋ณํ ๊ฐ๋ฅ, ๊ทธ ์ธ์ ๋ถ๊ฐ๋ฅ
}
}