-
[Algo Rhythm๐บ๐] ํ๋ก๊ทธ๋๋จธ์ค ๊ณ ๋์ kit ๋จ์ด๋ณํAlgo Rhythm๐บ๐/Programmers 2020. 7. 23. 14:28
๐ ๋ฌธ์ ์ค๋ช
๋ ๊ฐ์ ๋จ์ด 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์ ๊ตฌ๋ถํ๋ ์คํฌ์ ๋ฐฐ์ ๋ค!
'Algo Rhythm๐บ๐ > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
-