|
| 1 | +/** |
| 2 | + * @problem |
| 3 | + * ์ฃผ์ด์ง ๋ฌธ์์ด s๊ฐ ๋จ์ด ์ฌ์ wordDict์ ํฌํจ๋ ๋จ์ด๋ค๋ก๋ง ๊ตฌ์ฑ๋ ์ ์๋์ง ํ์ธํ๋ ๋ฌธ์ ์
๋๋ค. |
| 4 | + * ๋จ์ด ์ฌ์ ์ ๋จ์ด๋ค์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ฌธ์์ด s๋ฅผ ์์ ํ ๋๋ ์ ์์ด์ผ ํฉ๋๋ค. |
| 5 | + * |
| 6 | + * @constraints |
| 7 | + * - 1 <= s.length <= 300 |
| 8 | + * - 1 <= wordDict.length <= 1000 |
| 9 | + * - 1 <= wordDict[i].length <= 20 |
| 10 | + * - s์ wordDict[i]๋ ๋ชจ๋ ์๋ฌธ์ ์ํ๋ฒณ์ผ๋ก๋ง ๊ตฌ์ฑ๋ฉ๋๋ค. |
| 11 | + * |
| 12 | + * @param {string} s - ์ฃผ์ด์ง ๋ฌธ์์ด |
| 13 | + * @param {string[]} wordDict - ๋จ์ด ์ฌ์ |
| 14 | + * @returns {boolean} ๋ฌธ์์ด s๊ฐ ๋จ์ด ์ฌ์ ์ ๋จ์ด๋ค๋ก๋ง ๋๋ ์ ์๋์ง ์ฌ๋ถ |
| 15 | + * |
| 16 | + * @example |
| 17 | + * - ์์ 1: |
| 18 | + * ใด Input: s = "leetcode", wordDict = ["leet", "code"] |
| 19 | + * ใด Output: true |
| 20 | + * ใด Explanation: "leetcode"๋ "leet" + "code"๋ก ๋๋ ์ ์์ต๋๋ค. |
| 21 | + * - ์์ 2: |
| 22 | + * ใด Input: s = "applepenapple", wordDict = ["apple", "pen"] |
| 23 | + * ใด Output: true |
| 24 | + * ใด Explanation: "applepenapple"๋ "apple" + "pen" + "apple"๋ก ๋๋ ์ ์์ต๋๋ค. |
| 25 | + * - ์์ 3: |
| 26 | + * ใด Input: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] |
| 27 | + * ใด Output: false |
| 28 | + * ใด Explanation: "catsandog"๋ wordDict์ ๋จ์ด๋ค๋ก ๋๋ ์ ์์ต๋๋ค. |
| 29 | + * |
| 30 | + * @description |
| 31 | + * - ์๊ฐ ๋ณต์ก๋: O(n^2) |
| 32 | + * ใด ์ธ๋ถ ๋ฐ๋ณต๋ฌธ: ๋ฌธ์์ด s์ ๊ธธ์ด n์ ๋ํด 1๋ถํฐ n๊น์ง ๋ฐ๋ณต (O(n)) |
| 33 | + * ใด ๋ด๋ถ ๋ฐ๋ณต๋ฌธ: ๊ฐ i์ ๋ํด ์ต๋ i๋ฒ ๋ฐ๋ณต (O(n)) |
| 34 | + * ใด substring ๋ฐ Set ๊ฒ์: O(1) (substring์ ๋ด๋ถ์ ์ผ๋ก O(k)์ด์ง๋ง, k๋ ์ต๋ ๋จ์ด ๊ธธ์ด๋ก ๊ฐ์ฃผ) |
| 35 | + * ใด ๊ฒฐ๊ณผ์ ์ผ๋ก O(n^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง |
| 36 | + * - ๊ณต๊ฐ ๋ณต์ก๋: O(n + m) |
| 37 | + * ใด dp ๋ฐฐ์ด์ ํฌ๊ธฐ: s์ ๊ธธ์ด n + 1 (O(n)) |
| 38 | + * ใด wordSet: wordDict์ ๋จ์ด ๊ฐ์์ ๋น๋ก (O(m), m์ wordDict์ ๋จ์ด ์) |
| 39 | + */ |
| 40 | +function wordBreak(s, wordDict) { |
| 41 | + // wordDict๋ฅผ Set์ผ๋ก ๋ณํํ์ฌ ๊ฒ์ ์๋๋ฅผ O(1)๋ก ๋ง๋ฆ |
| 42 | + const wordSet = new Set(wordDict); |
| 43 | + |
| 44 | + // dp ๋ฐฐ์ด ์์ฑ: dp[i]๋ s์ ์ฒ์๋ถํฐ i๋ฒ์งธ ๋ฌธ์๊น์ง๊ฐ wordDict์ ๋จ์ด๋ค๋ก ๋๋ ์ ์๋์ง๋ฅผ ๋ํ๋ |
| 45 | + const dp = new Array(s.length + 1).fill(false); |
| 46 | + dp[0] = true; // ๋น ๋ฌธ์์ด์ ํญ์ ๋๋ ์ ์์ |
| 47 | + |
| 48 | + // i๋ ๋ฌธ์์ด์ ๋ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ |
| 49 | + for (let i = 1; i <= s.length; i++) { |
| 50 | + // j๋ ๋ฌธ์์ด์ ์์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ |
| 51 | + for (let j = 0; j < i; j++) { |
| 52 | + // dp[j]๊ฐ true์ด๊ณ , s[j:i]๊ฐ wordSet์ ํฌํจ๋์ด ์๋ค๋ฉด |
| 53 | + if (dp[j] && wordSet.has(s.substring(j, i))) { |
| 54 | + dp[i] = true; // dp[i]๋ฅผ true๋ก ์ค์ |
| 55 | + break; // ๋ ์ด์ ํ์ธํ ํ์ ์์ |
| 56 | + } |
| 57 | + } |
| 58 | + } |
| 59 | + |
| 60 | + // dp[s.length]๊ฐ true๋ผ๋ฉด ๋ฌธ์์ด s๋ฅผ wordDict์ ๋จ์ด๋ค๋ก ๋๋ ์ ์์ |
| 61 | + return dp[s.length]; |
| 62 | +} |
| 63 | + |
| 64 | +const s1 = "leetcode"; |
| 65 | +const wordDict1 = ["leet", "code"]; |
| 66 | +console.log(wordBreak(s1, wordDict1)); // true |
| 67 | + |
| 68 | +const s2 = "applepenapple"; |
| 69 | +const wordDict2 = ["apple", "pen"]; |
| 70 | +console.log(wordBreak(s2, wordDict2)); // true |
| 71 | + |
| 72 | +const s3 = "catsandog"; |
| 73 | +const wordDict3 = ["cats", "dog", "sand", "and", "cat"]; |
| 74 | +console.log(wordBreak(s3, wordDict3)); // false |
0 commit comments