๋ฌธ์ ํ์ด์ ๋ฐฑํธ๋ํน์ ์ ์ฉํ์๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ฑํ์ต๋๋ค.
๋ฌธ์
๋ ๊ฐ์ ๋จ์ด begin, target๊ณผ ๋จ์ด ์งํฉ words๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ต์ ๋ช ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ begin์ด target์ผ๋ก ๋ณํ ๋ ์ ์๋์ง๋ฅผ ๋ฐํํ๋ผ.
์ ํ์ฌํญ
- ํ ๋ฒ์ ํ ๊ฐ์ ์ํ๋ฒณ๋ง ๋ฐ๊ฟ ์ ์๋ค.
- words์ ์๋ ๋จ์ด๋ก๋ง ๋ณํํ ์ ์๋ค.
- ๊ฐ ๋จ์ด๋ ์ํ๋ฒณ ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค.
- 3 <= ๊ฐ ๋จ์ด์ ๊ธธ์ด <= 10
- begin !== target
- ๋ณํํ ์ ์๋ ๊ฒฝ์ฐ 0์ ๋ฐํํ๋ค.
์์
begin: hit
target: cog
words: [hot,dot,dog,lot,log,cog]
hit->hot->dot->dog->cog์ ๊ฐ์ด 4๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ๋ณํ ๊ฐ๋ฅ.
๋ฌธ์ ํ์ด
์ด ๋ฌธ์ ์ ๊ฐ์ฅ ์์ ํ์๋ฌธ์ ๋ words ์ํํ ๋ ์ด์ ๋ฌธ์์ด์ ํ์ฌ ๋ฌธ์์ด์ผ๋ก ์์ ํ ์ ์๋๊ฐ ์๋๊ฐ ์ด๋ค. ์์ ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ด์ ๋ฌธ์์ด์ ํ์ฌ ๋ฌธ์์ด๋ก ์์ ํ ๊ฒฝ์ฐ์ ์์ ํ์ง ์์ ๊ฒฝ์ฐ ๋ ๋ค ํ์ํด์ผํ๋ค. ์์ ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์์ ํ์ง ์์ ๊ฒฝ์ฐ๋ง ํ์ํ๋ค.
function solution(begin, target, words) {
let minAns = Infinity
const getDiff = (a, b) => a.split("").reduce((cnt, e, j) => cnt + (e !== b[j]), 0)
const backtrack = (i, x, n, visited) => {
if (x === target) {
minAns = Math.min(n, minAns)
}
visited.add(x)
if (i < words.length) {
if (getDiff(x, words[i]) === 1 && !visited.has(words[i])) {
backtrack(0, words[i], n+1, visited)
}
backtrack(i+1, x, n, visited)
}
visited.delete(x)
}
backtrack(0, begin, 0, new Set([begin]))
return minAns > words.length ? 0 : minAns
}
์๊ฐ๋ณต์ก๋: O(n! * n)
๊ณต๊ฐ๋ณต์ก๋: O(n)