[Algo Rhythm๐บ๐] ํ๋ก๊ทธ๋๋จธ์ค ๊ณ ๋์ kit ๋จ์ด๋ณํ
๐ ๋ฌธ์ ์ค๋ช
๋ ๊ฐ์ ๋จ์ด begin, target๊ณผ ๋จ์ด์ ์งํฉ words๊ฐ ์์ต๋๋ค. ์๋์ ๊ฐ์ ๊ท์น์ ์ด์ฉํ์ฌ begin์์ target์ผ๋ก ๋ณํํ๋ ๊ฐ์ฅ ์งง์ ๋ณํ ๊ณผ์ ์ ์ฐพ์ผ๋ ค๊ณ ํฉ๋๋ค.
1. ํ ๋ฒ์ ํ ๊ฐ์ ์ํ๋ฒณ๋ง ๋ฐ๊ฟ ์ ์์ต๋๋ค.
2. words์ ์๋ ๋จ์ด๋ก๋ง ๋ณํํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด begin์ด hit, target๊ฐ cog, words๊ฐ [hot,dot,dog,lot,log,cog]๋ผ๋ฉด hit -> hot -> dot -> dog -> cog์ ๊ฐ์ด 4๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ๋ณํํ ์ ์์ต๋๋ค.
๋ ๊ฐ์ ๋จ์ด begin, target๊ณผ ๋จ์ด์ ์งํฉ words๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ต์ ๋ช ๋จ๊ณ์ ๊ณผ์ ์ ๊ฑฐ์ณ begin์ target์ผ๋ก ๋ณํํ ์ ์๋์ง return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
-
๊ฐ ๋จ์ด๋ ์ํ๋ฒณ ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
-
๊ฐ ๋จ์ด์ ๊ธธ์ด๋ 3 ์ด์ 10 ์ดํ์ด๋ฉฐ ๋ชจ๋ ๋จ์ด์ ๊ธธ์ด๋ ๊ฐ์ต๋๋ค.
-
words์๋ 3๊ฐ ์ด์ 50๊ฐ ์ดํ์ ๋จ์ด๊ฐ ์์ผ๋ฉฐ ์ค๋ณต๋๋ ๋จ์ด๋ ์์ต๋๋ค.
-
begin๊ณผ target์ ๊ฐ์ง ์์ต๋๋ค.
-
๋ณํํ ์ ์๋ ๊ฒฝ์ฐ์๋ 0๋ฅผ return ํฉ๋๋ค.
๐ฏ ์ด๋ป๊ฒ ํ์๋
import java.util.Arrays;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int solution(String begin, String target, String[] words) {
if(!Arrays.stream(words).anyMatch(e -> e.equals(target))) return 0;
int answer = 0;
int root = 0,tIdx = 0;
ArrayList<String> wordList = new ArrayList<>(Arrays.asList(words));
ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
Queue<Integer> q = new LinkedList<>();
if(!Arrays.stream(words).anyMatch(e -> e.equals(begin))) wordList.add(begin);
boolean[] visited = new boolean[wordList.size()];
// init graph
for(int i = 0; i < wordList.size(); i++) {
if(wordList.get(i).equals(begin)) root = i;
if(wordList.get(i).equals(target)) tIdx = i;
ArrayList<Integer> lst = new ArrayList<>();
for(int j = 0; j < wordList.size(); j++) {
if(i == j) continue;
if(isOneDiff(wordList.get(i), wordList.get(j))) lst.add(j);
}
graph.add(lst);
}
// BFS
q.add(root);
q.add(null);
while(!q.isEmpty()) {
if(q.element() == null) {
answer++;
q.remove();
}
int parent = q.remove();
visited[parent] = true;
boolean found = false;
for(int child : graph.get(parent)) {
if(visited[child] == false) {
q.add(child);
}
if(child == tIdx) {
found = true;
break;
}
}
if(found) break;
q.add(null);
}
return answer + 1;
}
public boolean isOneDiff(String s1, String s2) {
int nDiff = 0;
for(int i = 0; i < s1.length(); i++) {
if(s1.charAt(i) != s2.charAt(i)) nDiff++;
if(nDiff > 1) return false;
}
return true;
}
}
๐ง ์ ์ ๋ ๊ฒ ํ์๋
์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋จํ๋ค.
๋จผ์ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋ 'begin'๊ณผ ๋ฐฐ์ด 'words'๋ฅผ ํฉ์ณ์ ๋ ธ๋๋ค์ ์งํฉ์ ๋ง๋ ๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ ์ด ๋ ธ๋๋ค์ ์ด์ฉํด์ ๊ทธ๋ํ๋ฅผ ๋ง๋ค์ด์ฃผ๋๋ฐ ๊ทธ๋ํ๋ ArrayList๋ฅผ ์ฌ์ฉํ ์ธ์ ๋ฆฌ์คํธ๋ก ํํํ๋ค. ์ ํํ ํ ๊ธ์๋ง ๋ค๋ฅผ ๊ฒฝ์ฐ ๋ณํํ ์ ์๊ธฐ ๋๋ฌธ์ ํ ๊ธ์์ ๋ค๋ฅธ ๊ธ์๊ฐ ์ ํํ ํ ๊ธ์๋ง ๋ค๋ฅผ ๊ฒฝ์ฐ ์ด์ด์ง๋๋ก ํ๋ค.
๊ทธ๋ํ๋ฅผ ๋ง๋ ํ๋ถํฐ๋ ๊ฐ๋จํ๋ค. BFS๋ฅผ ํตํด target์ ๊ฐ์ฅ ๋จผ์ ์ฐพ์์ ๋์ level์ ๊ตฌํ๋ฉด ๋๋ค. ์ด ๋ ํ ๊ฐ์ง ์ฃผ๋ชฉํด์ผ ํ ์คํฌ์ด ํ์ null์ ๋ฃ์ด์ BFS๋ฅผ ํ๋ฉด์ level์ ๊ตฌ๋ถํ๋ค๋ ๊ฒ์ด๋ค.
๐ ๋ฌด์์ ๋ฐฐ์ ๋
BFS๋ฅผ ํ ๋ null์ ๋ฃ์ด์ level์ ๊ตฌ๋ถํ๋ ์คํฌ์ ๋ฐฐ์ ๋ค!